AngularJS中的promise会捕获每个异常/错误吗?

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中,如果这有所不同),或者只是偏执狂.

Ber*_*rgi 4

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这里)。