【问题标题】:Firefox does not properly handle try/catch blocks in window.onerrorFirefox 无法正确处理 window.onerror 中的 try/catch 块
【发布时间】:2012-01-03 07:45:08
【问题描述】:

似乎 Firefox 将 window.onerror 事件处理程序中发生的任何错误视为致命异常,即使该异常被捕获。以下代码示例在 IE、Chrome 和 Safari 中按预期工作。在 Firefox 中,对不存在的 abc() 方法的调用会立即停止执行,而不是执行 catch 块和 onerror 处理程序的其余部分。

这是 Firefox 中的预期行为还是我做错了什么?

<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.7.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            window.onerror = function() {
                console.log('begin onerror');

                try {
                    abc(); // create a runtime error by calling a method that doesn't exist
                } catch(e) { 
                    console.log('catch block'); 
                }

                console.log('end onerror');
            };

            $('#btn').click(function() {
                xyz(); // create a runtime error by calling a method that doesn't exist
            });
        });
    </script>
</head>
<body>
    <form action="" name="frmEdit">
        <input type="button" value="Test" id="btn" name="btn" />
    </form>
</body>
</html>

【问题讨论】:

  • 这听起来像是一个围绕逻辑的错误,它可能存在以防止 onError 处理程序中的无限递归循环。通常,try...catch 优先于 onError 处理程序,但 onError 处理程序中,它看起来好像没有保持这种优先级。
  • 这也是我的怀疑。我可能最终会提交一份错误报告。我想我会先在这里得到更直接的回应。
  • 如果您在 onError 函数中设置断点,您将看到执行开始于 onError 而不是 xyz 调用。任何时候调用堆栈从 onError 开始,您都可能会看到此问题。改变执行堆栈的唯一方法,例如使用 setTimeout(abc, 0)...但这很难看。
  • 基于 Nickolay 更新的测试用例,我也向 jQuery 团队提交了错误报告。 bugs.jquery.com/ticket/10904

标签: javascript firefox dom


【解决方案1】:

正如this testcase 所演示的,它与jQuery 有关。

用触发此行为所需的最少代码替换 jQuery 依赖项将解释这一点,或者使这更容易在 Firefox 端调试和修复。

[编辑] 感谢 jrotello、dmethvin 和 Firefox 开发人员,underlying issue 应该在 Firefox 14 中得到修复(您可以在它发布之前使用 http://nightly.mozilla.org/ 对其进行测试)

【讨论】:

  • 这绝对似乎指向 jQuery。我什至没有想过尝试以不同的方式连接点击事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多