我在工作中继承了一个包含以下模式的十几个示例的代码库:
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中,如果这会产生影响),或者只是偏执狂。答案 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