从 $window.onerror 捕获 Angular 应用中的 JavaScript 错误是否可能?

6
在我的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" />
2个回答

12

您可以装饰$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中初始化,所以我正在寻找解决方法。 - Hoppe
1
$exceptionHandler服务默认已初始化,您只需要重写它。请查看此处的文档:https://docs.angularjs.org/api/ng/service/$exceptionHandler - Mehmet Otkun
我用 Angular 插件简单粗暴地包装了这个东西。如果有兴趣,我可以进一步完善它 https://github.com/joehoppe/angular-errors-on-toast - Hoppe
1
exception.message.indexOf(appErrorPrefix) === 0 时排除错误的逻辑是什么?我们不想要自己的错误吗? - AncientSwordRage

1
窗口.onerror事件不会从控制台错误中触发。以下是如何从控制台手动触发窗口.onerror事件的方法:
setTimeout(function() { notThere(); }, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接