捕获所有JavaScript未处理的异常


112

我正在尝试寻找或找出一种在警报框中显示应用程序中所有未处理的javascript异常的方法。我希望所有这些都在客户端完成,而不使用任何服务器端代码。我正在使用MVC3作为环境。

最近几天我一直在研究,没有完全找到我想要的东西。

我发现以下两种方法似乎几乎是我要寻找的方法,除了设置了这些方法之外,您必须将函数名传递到自定义方法中,以打印该方法中所有未处理的异常的堆栈跟踪具体功能。我正在寻找一种不必手动将函数名称传递给自定义方法的方法,该方法将打印所有未处理的异常的堆栈跟踪。我希望这些自定义方法只是“侦听”整个应用程序中所有未处理的异常。

http://eriwen.com/javascript/js-stack-trace/

同样类似于上一个链接:

https://github.com/eriwen/javascript-stacktrace

这是上面第二个链接中的基本代码,该代码显示指定javascript函数的堆栈跟踪:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

因此,总而言之,你们是否都知道有某种方式可以让某种“侦听器”侦听所有未处理的javascript异常,然后在警报框中将其打印到屏幕上?

谢谢!杰森


一件事...你会使用警报框吗?!你可以使用的console.log(ERROR_MESSAGE)到....
Mathlight

1
我认为这个问题可以解决 所有JS错误,这将对您有所帮助
Pilgerstorfer Franz 2012年

您可能应该看看这个问题: stackoverflow.com/questions/205688/…– 2012
标记

Answers:


129

您可以使用window.onerror方法执行此操作。

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
比尝试将我的整个应用程序包装在try / catch块中要好得多。:) 谢谢!
安东尼

15
请注意:“请注意,某些/许多错误事件不会触发window.onerror,您必须专门侦听它们。” - developer.mozilla.org/en-US/docs/Web/API/...
shusson

6
不需要在该代码中包含函数名称(myErrorHandler)...可以只是函数(errorMsg,url,lineNumber)
JoelFan

18
@JoelFan最好具有函数名称,以进行调试。调试器将使用函数名称,而不是显示为匿名函数。
杰里纳(Jerinaw)'17

太棒了,谢谢!一直试图调试一个复杂的照片缩放脚本,该脚本在100%的时间都可以正常工作,但在移动safai上会随机失败,并且没有“控制台”或“开发人员”窗口以查看发生了什么情况。当然,我有一个自己的“调试”窗口,可以使用一个秘密按钮打开它,但是我无法全局查看未尝试过的每个错误。这个添加完全向我显示了问题所在,并避免了我撕掉更多的头发!希望我能投票两次!
兰迪

48

您可以使用window.onerror,或正确地绑定到“错误”事件:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

如果要跟踪JavaScript错误,可以尝试Atatus。我在Atatus工作。


7
您为什么要“返回假”陈述?
kumaresan_sd

@kumaresan_sd它允许默认的事件处理程序火灾:developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
延Bodal

29

此外

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

您还可以捕获在promise回调(.then())中触发的所有错误,以监听unhandledrejection事件

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
是否必须同时使用window.onerrorwindow.addEventListener("error",或者使用其中之一已足够?
Tormod Haugene

2
您可以使用其中之一。如果您使用window.addEventListener("error",则发送useCaptureset to true以便还捕获未冒出的元素错误。developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…–
哈维尔·佩雷斯

1
谢谢!!该error事件没有捕获我的特定错误。unhandledrejection知道了

throw new Error('tja');用这种方法不会陷入最新的困境中……
OZZIE

1
我使用v80测试的@JavierPerez附加了该事件,然后直接引发错误,但未捕获到该错误,也未捕获到语法错误。
OZZIE

1

查看它基于Log4J的http://log4javascript.org。如果大多数代码都包装在try / catch语句中以处理异常,则可以将此库用作将输出发送到最终用户可以看到的始终可用的“对话框”或日志记录窗口的通用接口。您甚至可以使用执行window.print()的按钮将对话框的内容打印到打印机或PDF。祝好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.