可以从$ window.onerror中捕获Angular应用程序中的JavaScript错误

Hop*_*ppe 6 javascript onerror angularjs

在我的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
}]);
Run Code Online (Sandbox Code Playgroud)

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

是否有可能通过全球性的误差调用来捕获这个?

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

在我的控制器中,我似乎无法获得$ window.onerror工作.我尝试将onerror函数移动到控制器.我还试图看看img标签是否会产生错误无济于事.

<img ng-src="someFileThatDoesntExist.png" />
Run Code Online (Sandbox Code Playgroud)

Meh*_*kun 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)
    };
}
})();
Run Code Online (Sandbox Code Playgroud)