【问题标题】:Differences between handling errors with window.onerror and try-catch block使用 window.onerror 和 try-catch 块处理错误的区别
【发布时间】:2013-10-02 15:49:49
【问题描述】:

我正在考虑使用 window.onerrortry{...} catch(e){...} 块处理 JavaScript 运行时错误。

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror 状态:

请注意,一些/许多错误事件不会触发window.onerror,您必须专门监听它们。

看来window.onerrortry{...} catch(e){...}都可以处理ReferenceError:http://jsfiddle.net/7RARf/

另外,两者都无法处理 SyntaxError:http://jsfiddle.net/UXVs2/

除了使用window.onerror 处理错误和使用like 处理错误try{...} catch(e){...} 之间存在明显差异之外,try-catch 允许我们优雅地处理错误、重新抛出它们等,而 window.onerror 函数则不能,等等。两种处理错误的方式之间存在哪些其他差异?有没有可以用window.onerror 处理但不能用try{...} catch(e){...} 处理的错误?反之亦然?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    是的 - window.onerror 可以检测由浏览器工作流引起的错误 - try/catch 只对执行的 js 代码的有限部分进行操作。 window.onerror 可能会检测到插件问题或由不严格的代码引起的任何错误(jQ 等库、YT API 等 API 等) - 例如:您不能将外部库支持的异步代码放入 try 中(无需修改外部代码) ,您不能将 html 标签完成的脚本加载放入 try (它由浏览器管理) - window.onerror 将在脚本文件损坏并且无法加载到标签时触发 - window.onerror 引发的错误比 catch 更多能够支持 - 它还包含有关文件和行的信息。缺点是 window.onerror 只提供信息 - 代码被中断,使用 try/catch 可以提供回退行为并允许代码处理情况 - 即使有错误

    您可以使用 try/catch 来捕获语法错误,但前提是您正在评估代码形式的字符串:

    try{
      eval('(function(){asdhaowd;;;;asd;!!!@#!@$lolzolololol]]]]]]]})()');
    } catch(e){
      do sth();
    }
    

    它会捕获 eval 错误(意外的 ']' 或之前的东西) 我在我的网站上使用它来检测用户上传的损坏代码。 window.onerror 仅对调试有用 - 它不能防止代码崩溃,当 try 可以时

    【讨论】:

    • 如果你在尝试 - 你可能期望会发生错误 - window.onerror 对于跟踪代码中的意外错误很有用 - 例如。您可以将发送错误报告的功能绑定到您的邮件
    【解决方案2】:

    window.onerror 就像一个全局的 try/catch 块。使用 try/catch 来定位您知道可能会出错的特定块。

    window.onerror 是一般情况。我注意到的一件事是,您分配给 window.onerror 以处理错误的函数应该定义在调用它的代码之上,否则您可能会遇到函数未定义错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多