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

时间:2015-07-28 14:10:25

标签: javascript angularjs promise

我在工作中继承了一个包含以下模式的十几个示例的代码库:

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);
    });
}

其中backendService是一个Angular服务,后者又通过$http调用REST服务。

所以,我的问题是:try / catch真的有必要吗?是否有任何情况会导致承诺.catch无法捕获特定错误/异常?

这是整个早上对团队进行一些辩论的主题,我们提出的唯一决议是我们不会认为它&#39必要的,但(a)改变它会打破与它一起写的测试(也需要改变),以及(b)嗯......这是防御性编码,对吧?这不是一件坏事。

然而,当有更重要的事情要做的时候,实际上有必要将它重构为遗忘的优点并不是我所要问的问题。我只是想知道,当承诺传递到这样的时候是否是一个合理的模式(特别是在AngularJS中,如果这会产生影响),或者只是偏执狂。

2 个答案:

答案 0 :(得分:4)

  

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

没有。只会自动捕获从then / catch 回调中引发的异常。发生在它们之外的所有错误都需要明确处理。

  

是否会出现承诺.catch无法捕获的特定错误/异常的情况?

是。 backendService.getResults(input)调用可能不会返回一个承诺,但它可能会抛出异常。或者当backendService为空时,它甚至不会那么远,并且您将获得ReferenceError.getResults不是一个功能而且您将获得TypeError

  

是try / catch真的有必要吗?

不是真的。在后一种情况下,你的代码有一个严重的错误,你可能不在乎抛出和崩溃。 backendService.getResults(input)抛出的前一种情况受到严重鄙视。 Asynchronous functions should never throw但只返回承诺 - 正是因为您不必编写两个错误处理语句。

  好吧......它的防御性编码,对吧?这不是一件坏事。

是的,差不多。但这里有疑问。这里的同步异常真正意外,而不仅仅是可以处理故障的服务。 catch块中的日志消息应表示该消息。

请注意,它也不够防御。它并没有抓住getResults()确实返回的可能性更大的错误,而是一些不是承诺的错误。在那上面调用.then()可能会抛出。同样地,if (promise !== null)是可疑的,因为它会在错误地返回null时隐藏(我们在这里真的需要try-catch-else)。

答案 1 :(得分:1)

  

是try / catch真的有必要吗?

不是真的。只要您的backendService.getResults()返回承诺。与return $http(...)

一样
  

是否会出现特定错误/异常的任何情况   抛出承诺的.catch未能抓住?

我不这么认为,因为任何错误将被拒绝承诺,它将落入您的.catch()处理程序

  好吧......它的防御性编码,对吧?这不是一件坏事。

这取决于... Javascript try / catch有一些性能问题。因此,如果你只是为了确保使用它,你可以删除它:)

如果您愿意,请在此处进一步了解try-catch讨论:Javascript Try-Catch Performance Vs. Error Checking Code