【问题标题】:Catch a javascript error in an external script file在外部脚本文件中捕获 javascript 错误
【发布时间】:2011-11-22 07:34:32
【问题描述】:

我有一点 JavaScript (Jquery Tools' Overlay) 可能会在放置在不正确使用它的页面上时引发异常,我正在尝试优雅地处理它。

我有一个通用的 window.onerror 处理程序来挽救这些错误并将它们报告回服务器,但这并没有被触发。

我也无法围绕此代码包装 try/catch,因为它作为远程脚本包含在 HTML 中。

关于如何挽救外部脚本引发的错误的任何想法?

更新:示例如下。我应该纠正自己,window.onerror 确实被触发了,但是脚本没有继续运行(在示例中,警报永远不会发出警报)。

<html>
<script type="text/javascript">
window.onerror = function(e){ console.log("caught error: "+e); return true;}
</script>
<body>

<!-- this is the line in the dom that causes the script to throw -->
<a rel="nofollow"></a>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.4.1");</script>
<script src="http://cdn.jquerytools.org/1.2.5/tiny/jquery.tools.min.js"></script>

<script type="text/javascript">
//this code will throw an error in jquery tools
$("a[rel]").overlay();

alert("it's ok, I still ran.");
</script>

</body>

</html>

【问题讨论】:

  • 您的window.onerror 是否在引发错误之前定义?如果没有,它将无法正常工作。

标签: javascript exception-handling


【解决方案1】:

在加载/执行任何其他脚本之前定义错误处理程序。

<script>window.onerror = function(e){}</script>
<script src="external.js"></script>
<script>
function ole(){alert("Hi!")}
ole();
</script>

当您的脚本包含语法错误时,将不会调用错误处理程序(编辑:在某些较旧的浏览器中):

<script>window.onerror=function(e){alert("?")}
<script>
!@ //The error won't be caught.
</script>

【讨论】:

  • 谢谢,我刚刚更新了问题。它实际上是在触发 onerror,但是控制流也会停止,而不是继续。
  • 这是意料之中的。该错误由$ 抛出,并且未被任何本地错误处理程序捕获。当抛出错误时,该行之后的任何代码都不再执行(在这种情况下是在全局范围内定义的代码)。
  • 年度最佳 JavaScript hack x) 你成就了我的一天
  • 自发布答案后浏览器可能发生了变化 - window.onerror 现在看起来可以捕获语法错误,至少在 Chrome 中是这样
  • requirejs 加载脚本的错误也会被这个捕获吗?因为我不能。
【解决方案2】:

这是一个适用于现代浏览器的解决方案。旧版浏览器可能无法捕获语法错误。

<script>
  window.addEventListener('error', function(e) {
   alert(e.message);
   console.error(e.message, e.filename, e.lineno, e.colno, e.error);
  });
</script>
<script>
  this is a syntax error in JavaScript
</script>

这也适用于外部脚本&lt;script src="foobar.js"&gt;&lt;/script&gt;,但默认情况下浏览器会隐藏不同来源的脚本的详细错误信息。您可以使用crossorigin 修复它,如下所示:

<script crossorigin="anonymous" src="http://example.com/foobar.js"></script>

更多有用信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多