繁体   English   中英

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

[英]Do promises in AngularJS catch every exception/error?

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

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真的有必要吗? 是否会出现一个特定错误/异常的情况,即promise的.catch无法捕获?

这已经有点对球队辩论的整个上午的主题,我们已经拿出了唯一的解决办法是,我们不认为这是必要的,但(一)改变它打破写沿着它的测试(这也需要改变),(b)嗯......这是防御性编码,对吧? 这不是一件坏事。

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

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

序号只有从里面抛出的异常then / catch 回调会被自动捕获。 发生在它们之外的所有错误都需要明确处理。

是否会出现一个特定错误/异常的情况,即promise的.catch无法捕获?

是。 backendService.getResults(input)调用可能不会返回 promise,但它可能会抛出异常。 或者,当backendService为null时,它甚至没有那么远,你将得到一个ReferenceError.getResults不是一个函数,你会得到一个TypeError

是try / catch真的有必要吗?

并不是的。 在后一种情况下,你的代码有一个严重的错误,你可能不关心抛出和崩溃。 前一种情况,即backendService.getResults(input)抛出,被严重鄙视。 异步函数永远不应该throw但只返回promise - 正是因为你不必编写两个错误处理语句。

嗯......这是防御性的编码,对吗? 这不是一件坏事。

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

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

是try / catch真的有必要吗?

并不是的。 只要你的backendService.getResults()返回一个promise。 喜欢return $http(...)

是否会出现一个特定错误/异常的情况,即promise的.catch无法捕获?

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

嗯......这是防御性的编码,对吗? 这不是一件坏事。

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

如果您愿意, 在此处进一步了解try-catch讨论: Javascript Try-Catch Performance Vs. 检查代码时出错

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM