【问题标题】:how to catch ALL javascript errors with window.onerror? (including dojo)如何使用 window.onerror 捕获所有 javascript 错误? (包括道场)
【发布时间】:2012-01-16 19:49:59
【问题描述】:

这个问题是javascript: how to display script errors in a popup alert? 的后续问题,其中解释了如何使用以下方法捕获常规 javascript 错误:

<script type="text/javascript">
    window.onerror = function(msg, url, linenumber) {
        alert('Error message: '+msg+'\nURL: '+url+'\nLine Number: '+linenumber);
        return true;
    }
</script>

我试了一下,发现道场的错误是这样的:

TypeError: this.canvas is undefined         dojo.js (Row 446)

没有报告使用这种方法,这引出了我的问题:

如何使用window.onerror 报告所有 javascript 错误(尤其是dojo 错误)?

【问题讨论】:

  • 您是如何发现这些错误的?安慰?根据 MDN (developer.mozilla.org/en/DOM/window.onerror) 发送到窗口(可能是控制台)的所有错误都应该被拾取.... dojo 在您的事件连接之前触发这些事件吗?
  • 在包含 dojo.js 之前尝试移动 window.onerror 代码。

标签: javascript error-handling dojo


【解决方案1】:

这可能是 Dojo 使用了正确的错误处理方法(即 try-catch 块),以防止异常冒泡并到达您已在其上注册错误处理程序的窗口容器。

如果是这样,你没有办法做到这一点。没有错误通过 catch 块,因此没有调用错误处理程序。

正如 cmets 所指出的,您还可以使用特定于浏览器的调试 API,例如 Venkman 钩子并执行错误时中断 - 这种解决方案通常仅适用于特权代码(感谢 @Sam Hanes)。

您还可以通过On(require, 'error', function () {}); 在 DOJO 的异步脚本加载器上添加错误处理 -- @buggedcom 在 cmets 中提到的另一点

【讨论】:

  • 同意。您也许可以使用特定于浏览器的调试 API,例如 Firebug 用来实现其“Break on Error”功能的 Venkman 钩子,但这些 API 通常只能从特权代码(即 Firefox 扩展)访问。
  • try-catch 逻辑存在一个问题。我有一些结构损坏的动态脚本,因此捕获块格式错误,例如。通过添加一个额外的}。这有效地使 catch-block 无用,并且我没有收到任何错误消息来告诉我问题出在哪里。
  • 另外这不适用于dojo的异步脚本加载,在这种情况下可以使用On(require, 'error', function(){});代替
【解决方案2】:

你可以这样写代码:

var goErrHandler=window.onerror;
goErrHandler= function(msg, url, linenumber) {
console.log('Error message: '+msg+'\nURL: '+url+'\nLine Number: '+linenumber);
return true;
}

goErrHandler();

所以在控制台中你会看到这样的东西:

Error message: undefined
URL: undefined 
Line Number: undefined

【讨论】:

    【解决方案3】:

    更好的解决方案是使用 try/catch,例如

    try{
        if(a=='a'){
    
        }
    }catch(e){
        alert(e);
        //or send to server
        new Image().src='errorReport.php?e='+e;
    }
    

    Google Plus 似乎使用了这个。

    【讨论】:

    • try-catch 逻辑存在一个问题。我有一些结构损坏的动态脚本,因此捕获块格式错误,例如。通过添加一个额外的}。这有效地使 catch-block 无用,并且我没有收到任何错误消息来告诉我问题出在哪里。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2015-03-03
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多