angular5 如何抛异常_AngularJS - 承诺重新抛出捕获的异常

bd96500e110b49cbb3cd949968f18be7.png

In the following code, an exception is caught by the catch function of the $q promise:

// Fiddle - http://jsfiddle.net/EFpn8/6/

f1().then(function(data) {

console.log("success 1: "+data)

return f2();

})

.then(function(data) {console.log("success 2: "+data)})

.catch(function(data) {console.log("error: "+data)});

function f1() {

var deferred = $q.defer();

// An exception thrown here is not caught in catch

// throw "err";

deferred.resolve("done f1");

return deferred.promise;

}

function f2() {

var deferred = $q.defer();

// An exception thrown here is handled properly

throw "err";

deferred.resolve("done f2");

return deferred.promise;

}

However when I look in the console log output I see the following:

hExUq.png

The exception was caught in Angular, but was also caught by the error handling of the browser. This behavior does reproduce with Q library.

Is it a bug? How can I truly catch an exception with $q?

解决方案

Angular's $q uses a convention where thrown errors are logged regardless of being caught. Instead, if you want to signal a rejection you need to return $q.reject(... as such:

function f2() {

var deferred = $q.defer();

// An exception thrown here is handled properly

return $q.reject(new Error("err"));//throw "err";

deferred.resolve("done f2");

return deferred.promise;

}

This is to distinguish rejections from errors like SyntaxError. Personally, it's a design choice I disagree with but it's understandable since $q is tiny so you can't really build in a reliable unhandled rejection detection mechanism. In stronger libraries like Bluebird, this sort of thing is not required.

As a side note - never, ever throw strings : you miss on stack traces that way.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值