如何选择性地处理Javascript承诺中的错误
How do you optionally handle an error in a Javascript promise?
我正在node.js中学习Promises(使用Q库)。我已经将所有基于回调的代码移植到Promises,一切似乎都很好。然而,有一种模式我似乎一直在实施,我觉得这是可疑的。我觉得可能有更好的方法来处理这个问题,但实际上我不确定是什么。
基本上,如果您有可能从异步操作中获得错误,并且您可能无法在本地处理它。例如,处理某类错误,并传播其余错误。在基于回调的代码中,我会做一些类似的事情:
fs.readFile(path, 'utf-8', function (err, data) {
if(err) {
if(err.code == "ENOENT") {
cb(null, null); //it's fine to return null and eat the error
} else {
cb(err, null); //this is probably not fine, so barf
}
return;
}
...
});
在基于Promise的代码中,这变成了:
return fs.readFile(path, 'utf-8').then( function(data) { ... }, function(err) {
if(err.code == "ENOENT") {
return null; //it's fine to return null and eat the error
}
throw err; //this is probably not fine, so barf
});
我不喜欢的部分是重新抛出错误。我来自.NET背景,在那里,重新抛出这样的异常基本上是一种可以攻击的行为。然而,也许在JavaScript中这并不重要?或者,有没有一种方法可以编写我不知道的代码?
也许在JavaScript中这没关系?
事实上,这并不重要。重试并不是一种糟糕的做法,堆栈跟踪(如果在异步环境中可用的话)也不会受到影响
JS没有办法根据异常的类型有条件地捕获异常,您总是必须捕获所有异常。一些promise库,特别是Bluebird,确实为错误的模式匹配提供了语法糖。
有没有一种方法可以编写我不知道的代码?
如果你不喜欢throw
关键字,或者担心它会伤害你的异常对象(它不应该),你可以使用等效的
return Promise.reject(err);
相关文章:
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 承诺-如何正确地将错误附加到此示例
- 我能处理来自gap.client.load'的错误吗;的承诺
- $q.reject和处理AngularJS链接承诺中的错误
- 如何在使用替代承诺时解释 ajax 调用中的错误
- 处理角度.js承诺错误状态
- 为什么承诺会捕获语法错误
- Chai正如承诺:当承诺抛出错误时,处理错误
- 如何创建角度承诺中捕获的错误
- JS bluebird承诺错误没有给出任何细节
- 蓝鸟(或其他承诺库)保持承诺错误堆栈跟踪
- 异常捕获在功能上是否与承诺错误回调相同
- 如何在加载文件后将承诺错误传播到更高的承诺级别
- ES6承诺错误处理
- 多个承诺错误(承诺必须通过new构造)
- Nodejs承诺错误的使用
- 承诺错误/异常处理设计
- 处理链条中的承诺错误,是不是太急切了
- AngularJS - Firebase -承诺错误
- 如何正确处理请求-承诺错误