似乎最好的做法是不要在try主体中放置多行业务逻辑
其实我会说是的。通常,您需要使用该值来处理
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}如果您只想抓住并处理承诺中的错误,则有三种选择:
在外部声明变量,然后根据是否存在异常进行分支。可以采用多种形式,例如
- 为
catch
块中的变量分配一个默认值 return
早期或重新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 createdconsole.log(createdUser)// business logic goes here} catch (error) {
if (error instanceof CreationError) {
console.error(error) // from creation
} else {
throw error;
}
}
不幸的是,标准Javascript(仍然)不支持条件异常的语法。
- 使用
then
两个回调,而不是try
/catch
。这确实是最丑陋的方式,我个人的建议也是出于其简单性和正确性,而不是依靠标记的错误或结果值的外观来区分对承诺的实现和拒绝:await this.User.create(userInfo).then(createdUser => {// user was successfully createdconsole.log(createdUser)// business logic goes here}, error => {
console.error(error) // from creation
});
当然,它带有引入回调函数的缺点,这意味着您不能像从外部函数那样轻松地
break/
continue循环或执行早期操作
return。



