【问题标题】:Possible to catch JavaScript errors within an Angular app from $window.onerror可以从 $window.onerror 捕获 Angular 应用程序中的 JavaScript 错误
【发布时间】:2015-03-03 04:36:06
【问题描述】:

在我的 app.module().run() 中,我设置了一个 onerror 消息,以便在遇到 javascript 错误时弹出一个 toastr 消息。

我希望这适用于我的整个 ngApp。这可能吗?

以下代码弹出一个 toast,因为 asdf 是无效的 JavaScript。

angular.module("app").run(['notificationFactory', '$window',
    function (notificationFactory, $window) {
    $window.onerror = function (errorMsg, url, lineNumber) {
        notificationFactory.error(errorMsg);
   };

   asdf
}]);

但如果我将 'asdf' 放入控制器中,$window.onerror 不会触发。

是否可以通过全局 onerror 调用来捕获它?

App.run 在我的 app.js 文件中,并在我的控制器之前加载。

在我的控制器中,我似乎根本无法让 $window.onerror 工作。我尝试将 onerror 功能移至控制器。我也试着看看img标签是否会产生错误无济于事。

<img ng-src="someFileThatDoesntExist.png" />

【问题讨论】:

    标签: javascript angularjs onerror


    【解决方案1】:

    您可以装饰 $exceptionHandler 提供程序。试试下面;

    (function () {
        'use strict';
    
    var app = angular.module('myApp');
    
    // Configure by setting an optional string value for appErrorPrefix.
    // Accessible via config.appErrorPrefix ().
    
    app.config(['$provide', function ($provide) {
        $provide.decorator('$exceptionHandler',
            ['$delegate', 'notificationFactory', extendExceptionHandler]);
    }]);
    
    // Extend the $exceptionHandler service to also display a toast.
    function extendExceptionHandler($delegate, notificationFactory) {
        var appErrorPrefix = 'myPrefix';
        return function (exception, cause) {
            $delegate(exception, cause);
            if (appErrorPrefix && exception.message.indexOf(appErrorPrefix) === 0) { return; }
    
            var errorData = { exception: exception, cause: cause };
            var msg = appErrorPrefix + exception.message;
            notificationFactory.error(msg);
            console.log(appErrorPrefix, errorData)
        };
    }
    })();
    

    【讨论】:

    • 这看起来很有希望。但似乎工厂没有在 app.config 中初始化,所以我正在寻找解决方法
    • $exceptionHandler 服务默认初始化,你只需要重写它。请看文档here
    • 我在一个角度插件中包装了一个快速而肮脏的版本。如果有任何兴趣,我可以进一步充实它github.com/joehoppe/angular-errors-on-toast
    • exception.message.indexOf(appErrorPrefix) === 0时排除错误的逻辑是什么?我们不想自己犯错吗?
    【解决方案2】:

    window.onerror 事件不会因控制台错误而触发。以下是如何从控制台手动触发 window.onerror 事件:

    setTimeout(function() { notThere(); }, 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2012-01-16
      • 1970-01-01
      • 2018-05-24
      • 2016-06-06
      • 1970-01-01
      • 2011-10-29
      相关资源
      最近更新 更多