我喜欢Typescript等中提供的新Async/Await功能的平坦性。但是,我不确定我是否喜欢这样一个事实,我必须在await块的外部声明我是try...catch的变量才能使用它后来。像这样:

let createdUser
try {
    createdUser = await this.User.create(userInfo)
} catch (error) {
    console.error(error)
}

console.log(createdUser)
// business
// logic
// goes
// here

如果我错了,请纠正我,但是似乎最好的做法是不要在try主体中放置多行业务逻辑,所以我只剩下在块外声明createdUser并将其分配在块中的选择,然后再使用它。

在这种情况下,最佳做法是什么?

最佳答案



其实我会说是的。您通常希望使用值对该文件进行catch:

try {
    const createdUser = await this.User.create(userInfo);

    console.log(createdUser)
    // business logic goes here
} catch (error) {
    console.error(error) // from creation or business logic
}

如果您只想捕获并处理 promise 中的错误,则有三种选择:
  • 在外部声明变量,并根据是否存在异常进行分支。可以采用多种形式,例如
  • catch
  • 中的变量分配默认值
    早期
  • return或re- throw catch
  • 中的异常
  • 设置一个标志catch块是否捕获到异常,并在if条件下对其进行测试
  • 测试已分配的变量的值

  • let createdUser; // or use `var` inside the block
    try {
        createdUser = await this.User.create(userInfo);
    } catch (error) {
        console.error(error) // from creation
    }
    if (createdUser) { // user was successfully created
        console.log(createdUser)
        // business logic goes here
    }
    
  • 测试捕获的异常的类型,然后根据该异常处理或重新抛出它。
    try {
        const createdUser = await this.User.create(userInfo);
        // user was successfully created
        console.log(createdUser)
        // business logic goes here
    } catch (error) {
        if (error instanceof CreationError) {
            console.error(error) // from creation
        } else {
            throw error;
        }
    }
    

    不幸的是,标准JavaScript(仍然)不支持conditional exceptions的语法。
  • 使用 then with two callbacks代替try/catch。这确实是最丑陋的方式,我个人的建议也是出于其简单性和正确性,而不是依靠标记的错误或结果值的外观来区分对 promise 的实现和拒绝:
    await this.User.create(userInfo).then(createdUser => {
        // user was successfully created
        console.log(createdUser)
        // business logic goes here
    }, error => {
        console.error(error) // from creation
    });
    

    当然,它具有引入回调函数的缺点,这意味着您不能像从外部函数那样轻易地进行break/continue循环或执行早期return那样。
  • 10-07 14:39
    查看更多