【发布时间】:2015-10-19 03:47:46
【问题描述】:
我在工作中继承了一个代码库,其中包含十几个以下模式的示例:
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 无法捕获的情况?
这一直是整个上午团队争论的主题,我们提出的唯一解决方案是我们不认为这是必要的,但是 (a)更改它会破坏与它一起编写的测试(这也需要更改),并且(b)好吧......这是防御性编码,对吗?这不是一件坏事。
不过,当有更重要的事情要做时,真正费心将其重构为遗忘的好处并不是我要问的。我只是想知道当像这样传递承诺时(特别是在 AngularJS 中,如果这会产生影响),这是否是一种合理的模式,或者只是偏执狂。
【问题讨论】:
-
不需要。你只能有你的
then()和catch() -
在我看来它只是部分有用。如果您的代码中有异常触发 XHR(大概)以获取结果,则此代码将捕获,但通常该代码更为人所知,并且不受运行时异常的影响。棘手的部分是来自服务器的响应——由于服务返回了您没想到的东西,您更有可能在那里遇到异常。这将由 Promise 拒绝处理。如果您在服务中安全(通常)处理
input,我认为没有必要尝试/捕获。 -
测试起来相对容易。首先在各种方法中引入语法错误,包括在 $http 调用之前和回调内部,然后测试 http 错误,例如 404 500 和 CORS 错误。我的假设是 .catch 在 http 请求启动并返回 promise 之后捕获所有内容,但不是在此之前。
标签: javascript angularjs promise