您如何选择性地处理 Javascript 承诺中的错误?
How do you optionally handle an error in a Javascript promise?
我正在 node.js 学习 Promises(使用 Q 库)。我已将所有基于回调的代码移植到 Promises,一切似乎都很好。但是,有一种模式我似乎一直在实施,但我觉得它很可疑。我觉得可能有更好的方法来处理这个问题,但我不确定是什么。
基本上,如果您有可能从异步操作中获取错误,并且您可能无法在本地处理它。例如,处理某些 class 错误,并传播其余错误。在基于回调的代码中,我会做类似的事情:
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 中没关系?或者,有什么方法可以编写我不知道的这段代码吗?
maybe in JavaScript it doesn't matter?
确实,没关系。重新抛出不是一个坏习惯,堆栈跟踪(如果在异步环境中完全可用)不会受到伤害。
JS 没有办法根据类型有条件地捕获异常,你总是必须捕获它们。不过,一些 promise 库 Bluebird specifically 确实提供了错误模式匹配的语法糖。
Is there a way to write this code that I don't know of?
如果您不喜欢 throw
关键字,或者担心它会损害您的异常对象(它不应该),您可以使用等效的
return Promise.reject(err);
我正在 node.js 学习 Promises(使用 Q 库)。我已将所有基于回调的代码移植到 Promises,一切似乎都很好。但是,有一种模式我似乎一直在实施,但我觉得它很可疑。我觉得可能有更好的方法来处理这个问题,但我不确定是什么。
基本上,如果您有可能从异步操作中获取错误,并且您可能无法在本地处理它。例如,处理某些 class 错误,并传播其余错误。在基于回调的代码中,我会做类似的事情:
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 中没关系?或者,有什么方法可以编写我不知道的这段代码吗?
maybe in JavaScript it doesn't matter?
确实,没关系。重新抛出不是一个坏习惯,堆栈跟踪(如果在异步环境中完全可用)不会受到伤害。
JS 没有办法根据类型有条件地捕获异常,你总是必须捕获它们。不过,一些 promise 库 Bluebird specifically 确实提供了错误模式匹配的语法糖。
Is there a way to write this code that I don't know of?
如果您不喜欢 throw
关键字,或者担心它会损害您的异常对象(它不应该),您可以使用等效的
return Promise.reject(err);