【问题标题】:Angular logs error to console before raising promise.catchAngular 在提升 promise.catch 之前将错误记录到控制台
【发布时间】:2015-04-25 07:17:14
【问题描述】:

我觉得我有点发疯了,但即使我定义了catch,Angular 似乎也会为承诺抛出错误。它将错误抛出到控制台,然后允许catch 运行。

这是super-simple fiddle

测试代码:

$q.when(1)
    .then(function() {
        throw new Error("test");
    }).catch(function(error) {
        console.log('error caught', error);
    });

生成的控制台

(肮脏的骗子!)

这里是a fiddle showing what I expect to happen:catch 被引发,并且没有其他错误记录到控制台。是我没有配置某些东西,还是 Angular 实现了一个违背承诺的规范?

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    angular 默认将所有错误记录到控制台。

    angular 还提供了一种覆盖此行为的方法。 $exceptionHandler 是一个全局服务,它有机会处理任何异常($http、$digest 期间的错误等)。

    如果添加这段代码:

    myApp.factory('$exceptionHandler', function() {
      return function(exception, cause) {
        exception.message += ' (caused by "' + cause + '")';
        //throw exception;
      };
    });
    

    然后所有错误将停止进一步记录。虽然会处理 catch() 处理程序。更新小提琴:http://jsfiddle.net/5jjx5rn3/

    更新:

    正如 cmets 中的 dnc253 所指出的,如果您打算实际覆盖 angularjs 服务,则有更好的方法。即使不是这个问题的重点,最好知道在任何模块中简单地声明一个具有相同名称的服务,该服务都会被完全替换(后进胜出)。如果想在原始服务周围添加功能,decorator 是正确的选择。

    【讨论】:

    • 这是正确的答案,但装饰器优先于覆盖整个服务。见stackoverflow.com/questions/13595469/…
    • 但是异常难道不应该到这一步吗?不是应该已经被catch处理了吗?
    • @DavidGrinberg catch 发生在此方法中发生的处理之后。这就是为什么它首先出现在控制台中
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多