【问题标题】:Catching all javascript unhandled exceptions捕获所有 javascript 未处理的异常
【发布时间】:2012-09-16 07:17:03
【问题描述】:

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

过去几天我一直在研究,但没有找到我正在寻找的确切内容。

我在下面找到了 2 种方法,它们看起来几乎就是我要寻找的,除了这些方法是设置的,因此您必须将函数名称传递给自定义方法以打印所有未处理异常的堆栈跟踪在该特定功能中。我正在寻找一种不必手动将函数名称传递给自定义方法的方法,该方法打印所有未处理异常的堆栈跟踪。我希望这些自定义方法只“监听”整个应用程序中所有未处理的异常。

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 未处理的异常,然后在警报框中将它们打印到屏幕上吗?

谢谢! 杰森

【问题讨论】:

标签: javascript


【解决方案1】:

除了

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;
})

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

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

【讨论】:

  • 是否必须同时使用window.onerrorwindow.addEventListener("error",或者使用其中之一就足够了?
  • 您可以使用其中之一。如果您使用window.addEventListener("error",请将useCapture 设置为true,以便同时捕获没有冒泡的元素错误。 developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
  • 谢谢!! error 事件没有发现我的特定错误。 unhandledrejection 知道了。
  • throw new Error('tja'); 没有通过这种方法被最新的 chrome 捕获...
  • @JavierPerez 我使用 v80 进行了测试,附加了事件并在之后直接抛出错误,它没有被捕获,也没有捕获语法错误。
【解决方案2】:

您可以使用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 工作。

【讨论】:

【解决方案3】:

您可以使用 window.onerror 方法来做到这一点。

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

【讨论】:

  • 比尝试将我的整个应用程序包装在 try/catch 块中要好得多。 :) 谢谢!
  • 请注意:“请注意,一些/许多错误事件不会触发 window.onerror,您必须专门监听它们。” -developer.mozilla.org/en-US/docs/Web/API/…
  • 代码中不需要包含函数名(myErrorHandler)...可以是函数(errorMsg, url, lineNumber)
  • @JoelFan 最好有函数名,以便调试。调试器将使用函数名而不是显示为匿名函数。
  • throw new Error('tja'); 没有通过这种方法被最新的 chrome 捕获...
【解决方案4】:

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

【讨论】:

  • 这如何回答捕获所有未处理异常的问题?
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2011-02-16
  • 2017-11-25
  • 1970-01-01
  • 2013-04-08
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多