AngularJS的异常处理程序中捕获的错误

时间:2017-02-15 13:01:48

标签: angularjs exception

我有一些代码处理可能会抛出错误的promises。我试图用一个很小的例子来说明问题。

在函数g1g2中,我们调用函数f,它不会抛出错误但可以设置对象err并出现错误:

let err;

function f() {
    err = new Error('error');
    return $q.when('ok');
}

// First implementation
function g1() {
    return f().then(res => {
        if (err) {
            throw err;
        } else {
            return res;
        }
    });
}

// Second implementation
function g2() {
    const deferred = $q.defer();
    f().then(res => {
        if (err) {
            deferred.reject(err);
        } else {
            deferred.resolve(res);
        }
    });
    return deferred.promise;
}

g2().then(res => console.log(res))
    .catch(err => console.error(err));

我认为这两种实现方式会得到完全相同的结果,但存在差异。我还有一个异常处理程序来捕获我的应用程序中所有未捕获的错误:

angular.module('myModule').factory('$exceptionHandler', function () {
    return function (exception, cause) {
       console.error(exception);
    };
});

调用g2时,由于捕获了错误,因此不会调用异常处理程序。但是调用g1就是这种情况:我从异常处理程序获取第一个日志,然后是catch函数的第二个日志。

有人会对这种行为差异有所了解吗?我认为g1中使用的语法更容易编写和阅读,但我也不会将我的错误抛出两次......

0 个答案:

没有答案