Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可能从$window.onerror捕获Angular应用程序中的JavaScript错误_Javascript_Angularjs_Onerror - Fatal编程技术网

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

可能从$window.onerror捕获Angular应用程序中的JavaScript错误,javascript,angularjs,onerror,Javascript,Angularjs,Onerror,在我的app.module().run()中,我设置了一条onerror消息,以便在遇到javascript错误时弹出一条toastr消息 我希望这能在我的整个NGAP中起作用。可能吗 下面的代码弹出一个toast,因为asdf是无效的JavaScript angular.module("app").run(['notificationFactory', '$window', function (notificationFactory, $window) { $window.on

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

我希望这能在我的整个NGAP中起作用。可能吗

下面的代码弹出一个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" />

您可以装饰$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)
    };
}
})();

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

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

这看起来很有希望。但似乎工厂并没有在app.config中初始化,所以我正在研究一种方法,来解决$exceptionHandler服务在默认情况下是初始化的,您只需要重写它。请看documenthation,我在一个角度插件中包装了一个快速而肮脏的版本。如果它感兴趣的话,我可以进一步充实它当
exception.message.indexOf(appErrorPrefix)==0时排除错误的逻辑是什么?难道我们不希望自己犯错误吗?