dae*_*ina 9 javascript promise angularjs
我在工作中继承了一个包含以下模式的十几个示例的代码库:
var promise = null;
try {
promise = backendService.getResults(input);
}
catch (exception) {
console.err(exception);
}
if (promise !== null) {
promise.then(function (response) {
// do stuff
})
.catch(function (error) {
console.err(error);
});
}
Run Code Online (Sandbox Code Playgroud)
backendServiceAngular服务在哪里通过调用REST服务$http.
所以这是我的问题:try/catch真的有必要吗?是否会出现任何抛出特定错误/异常的情况,承诺.catch无法捕获?
这已经有点对球队辩论的整个上午的主题,我们已经拿出了唯一的解决办法是,我们不认为这是必要的,但(一)改变它打破写沿着它的测试(这也需要改变),(b)嗯......这是防御性编码,对吧?这不是一件坏事.
然而,当有更重要的事情要做的时候,实际上有必要将它重构为遗忘的优点并不是我所要求的.我只是想知道这是一个合理的模式,当承诺被传递这样时(特别是在AngularJS中,如果这有所不同),或者只是偏执狂.
AngularJS 中的 Promise 能捕获所有异常/错误吗?
then不会。只有从内部/catch 回调抛出的异常才会被自动捕获。在它们之外发生的所有错误都需要显式处理。
是否会出现抛出 Promise
.catch无法捕获的特定错误/异常的情况?
是的。该backendService.getResults(input)调用可能不会返回承诺,但可能会引发异常。或者当 is null 时它甚至没有达到那么远backendService,你会得到一个ReferenceErroror.getResults不是一个函数,你会得到一个TypeError.
try/catch 真的有必要吗?
并不真地。在后一种情况下,你的代码有一个严重的错误,你可能不关心抛出和崩溃。前一种情况,即backendService.getResults(input)抛出的情况,受到严重鄙视。异步函数永远不应该throw返回承诺,而只能返回承诺 - 正是因为您不必编写两个错误处理语句。
嗯...这是防御性编码,对吧?这不是一件坏事。
是的,差不多。但这里有疑问。同步异常在这里确实是意想不到的,不仅仅是一个可以处理失败的服务。块中的日志消息catch应该表明这一点。
请注意,它的防御能力也不够。它没有捕获getResults()返回的可能更可能的错误,而是捕获不是承诺的东西。调用.then()它可能会抛出异常。同样, 也是if (promise !== null)可疑的,因为它会隐藏何时null错误返回(我们确实可能需要try-catch-else这里)。
| 归档时间: |
|
| 查看次数: |
1491 次 |
| 最近记录: |