捕获所有javascript未处理的异常

jre*_*247 97 javascript

我正在尝试找到或找出一种在警报框中显示应用程序中所有未处理的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;
}
Run Code Online (Sandbox Code Playgroud)

总而言之,你们都知道有什么方法可以让某些"倾听者"听取所有javascript未处理的异常,然后将它们打印到屏幕上的警告框中吗?

谢谢!贾森

Nis*_*ish 117

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

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

  • @JoelFan最好有函数名,以便进行调试.调试器将使用函数名称而不是显示为匿名函数. (18认同)
  • 只是抬头:"请注意,一些/很多错误事件不会触发window.onerror,你必须专门听取它们." -https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror (14认同)
  • 比试图将我的整个应用程序包装在try/catch块中要好得多.:) 谢谢! (10认同)
  • 没有必要在该代码中包含函数名称(myErrorHandler)...只能是函数(errorMsg,url,lineNumber) (6认同)
  • 使用这种方法,最新的 chrome 中不会捕获 ` throw new Error('tja');` ...... (6认同)

Fiz*_*han 44

你可以使用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;
})
Run Code Online (Sandbox Code Playgroud)

如果您想跟踪JavaScript错误,可以尝试使用Atatus.我在阿塔图斯工作.

  • 您为什么要“返回假”陈述? (5认同)

Jav*_*rez 19

此外

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

您还可以捕获promise callback(.then())内部触发unhandledrejection事件的所有错误

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

  • 您可以使用其中之一。如果您使用 `window.addEventListener("error"`,请将 `useCapture` 设置为 `true`,以便捕获未冒泡的元素错误。https://developer.mozilla.org/en-US/文档/Web/API/GlobalEventHandlers/onerror (3认同)
  • 是否有必要同时使用 `window.onerror` 和 `window.addEventListener("error"`,或者使用其中之一就足够了? (2认同)

Geo*_*tan 5

您有两个可用于此目的的事件侦听器:unhandledrejectionerror

\n

第一个 未处理的拒绝

\n
\n

当没有拒绝处理程序的 JavaScript Promise 被拒绝时,unhandledrejection 事件将发送到脚本的全局范围;通常,这是窗口,但也可能是 Worker。

\n
\n

要为 Promise 提供全局错误处理程序,您可以侦听以下事件:

\n
// event is of type PromiseRejectionEvent\nwindow.addEventListener("unhandledrejection", (event) => {\n  event.preventDefault(); // This will not print the error in the console });\n\n  console.log("Unhandled promise rejection"); \n  console.log(event.reason);\n});\n
Run Code Online (Sandbox Code Playgroud)\n

使用说明中,它提到:

\n
\n

允许未处理的拒绝事件冒泡最终将导致错误消息输出到控制台。您可以通过在 PromiseRejectionEvent 上调用 PreventDefault() 来防止这种情况发生;有关示例,请参阅下面的防止默认处理。

\n
\n

因此,如果您不想看到环境记录的消息,event.preventDefault()可以使用。

\n

第二个 错误

\n
\n

当资源加载失败或无法使用 \xe2\x80\x94(例如,如果脚本出现执行错误)时,将在 Window 对象上触发错误事件。

\n
\n

要为其他错误提供全局错误处理程序,您可以侦听以下事件:

\n
window.addEventListener("error", (event) => {\n  event.preventDefault(); // This will not print the error in the console\n\n  console.log("Unhandled error encountered");\n  console.log(event.message);\n});\n
Run Code Online (Sandbox Code Playgroud)\n


Rob*_*ton -6

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

  • 这如何回答捕获所有**未处理的**异常的问题? (4认同)