【问题标题】:Chrome truncates error messages and adds "<omitted>" in window.onerrorChrome 会截断错误消息并在 window.onerror 中添加“<省略>”
【发布时间】:2014-04-07 14:49:44
【问题描述】:

我们使用 window.onerror 来捕获未处理的异常(为开发团队记录它们,并显示友好的用户警报)。最近我们注意到,在谷歌浏览器中,如果错误消息超过一定长度就会被截断,并且在错误消息中神秘地添加了文本“...&lt;omitted&gt;...”。

下面的代码将演示这一点(在 Chrome 版本 33.0.1750 中)。我想知道有没有其他人遇到过这个问题?

<html>
    <head>
        <script type="text/javascript">

        window.onerror = function (errorMsg, url, lineNumber) {
            alert('Error: ' + errorMsg);
        }

        var throwError = function () {
            throw new Error(
            'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' +
            'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' + 
            'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' + 
            'Some text gets truncated before this point!');
        }

        </script>
    </head>
    <body>
        <h1>Hello World</h1>
        <input type="button" onclick="throwError()" value="Throw uncaught error!" /><br /><br />
    </body>
</html>

【问题讨论】:

  • Argghh,快把我逼疯了!
  • @masonk - 您是否尝试过我在下面的回答,或者您使用的是无法编辑的第 3 方软件?
  • 我们有一个自定义错误处理程序,我正在根据您的回答进行修改。谢谢你。
  • 他们开始将错误消息限制为 256 个字符 (Source)。我认为这是一个糟糕的举动。

标签: javascript google-chrome onerror


【解决方案1】:

我找到了一个行之有效的解决方案。

Chrome 实现了新的 HTML 标准,其中向 onerror 处理程序添加了 2 个新参数,即:colNumbererror 对象(包括堆栈跟踪)。

见:

根据我下面的代码示例,可以通过error.message 访问完整的错误消息。这是第一个参数message 的副本,Chrome 似乎决定截断message。不知道为什么他们必须打破一些正在工作的东西...... :-(

IE 和 FireFox(在我当前的版本中:11.0.9600 和 26.0)还没有实现新的 5 参数标准,所以代码允许这样做。

希望这对某人有所帮助!

返回完整错误消息的代码示例:

<html>
<head>
    <script type="text/javascript">

    //Chrome passes the error object (5th param) which we must use since it now truncates the Msg (1st param).
    window.onerror = function (errorMsg, url, lineNumber, columnNumber, errorObject) {
        var errMsg;
        //check the errorObject as IE and FF don't pass it through (yet)
        if (errorObject && errorObject !== undefined) {
                errMsg = errorObject.message;
            }
            else {
                errMsg = errorMsg;
            }
        alert('Error: ' + errMsg);
    }

    var throwError = function () {
        throw new Error(
        'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' +
        'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' + 
        'Something went wrong. Something went wrong. Something went wrong. Something went wrong. ' + 
        'Text does not get truncated! :-)');
    }

    </script>
</head>
<body>
    <h1>Hello World</h1>
    <input type="button" onclick="throwError()" value="Throw uncaught error!" /><br /><br />
</body>

【讨论】:

  • 不错的发现。这一直在驱使我们喝酒。 Google 必须拥有附近的酒类商店。
  • 甜蜜,甜蜜的发现!不过,您仍然可以使用console.error(errMsg) 而不是警报。我讨厌警报 ;-) 它使事情变得一点更具可读性。
  • 我在我的 Angular 项目的顶部有这个脚本,但是我没有看到它改变了错误输出。仍然得到截断的错误。其他人有更好的运气吗?我还注意到与此 chrome 更改相关的 Angular github 问题引用了此 SO。
  • 我仍然没有得到任何有用的东西。目前,当我收到错误消息时,它会显示“错误:脚本错误”......并不是那么有帮助。我检查了函数,似乎通过 chrome 甚至没有得到errorObject
【解决方案2】:

这是 Chrome 中的一个已知问题,并且已经被其他人注意到:https://github.com/angular/angular.js/issues/5568

我认为没有解决方法,但该错误已报告:http://crbug.com/331971

【讨论】:

  • FWIW,此问题已在版本 37 中修复,现在可通过开发渠道获得。
猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多