[英]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.