日志显示错误对象:{"isTrusted":true}而不是实际的错误数据

fre*_*hie 20 javascript exception-handling

我有一个如下所示的事件处理程序:

window.addEventListener('error', function (e) {

    SendLogErrorToServer('Error: ' + e.message +
                         'Error object: ' + JSON.stringify(e) +
                         'Script: ' + e.filename +
                         'Line: ' + e.lineno +
                         'Col: ' + e.colno +
                         'Nav: ' + window.navigator.userAgent));

}, false);
Run Code Online (Sandbox Code Playgroud)

问题是我收到的内容如下:

Error: Script error.Error object: {"isTrusted":true} Script: Line: 0 Col: 0 Nav: Mozilla/5.0
Run Code Online (Sandbox Code Playgroud)

如您所见,没有有用的行号或错误消息.我需要更改以获取行号和错误详细信息?

Mou*_*eer 33

在这种情况下,您需要注意两点.两点都是相互独立的,应该修复以解决您的问题.

第一

您遇到的错误是一种特殊类型的错误 Script Error

"脚本错误"是onerror当错误源自从不同来源(不同域,端口或协议)提供的JavaScript文件时,浏览器发送给回调的内容.这很痛苦,因为即使出现错误,您也不知道错误是什么,也不知道它来自哪个代码.

这不是JavaScript错误

出于安全原因,浏览器故意隐藏源自不同来源的脚本文件的错误.这是为了避免脚本无意中将潜在敏感信息泄露给它无法控制的onerror回调.因此,浏览器只能window.onerror深入了解源自同一域的错误.我们所知道的是发生了一个错误 - 没有别的!

要解决此问题:

要修复并获取正常的错误对象,请查看此博客文章

第二

当您尝试对任何Error对象进行字符串化时,结果将不会令人满意,因为您将丢失几乎所有数据.

原因就在于此

JSON.stringify仅处理可枚举属性,但Error对象将上下文数据存储在不可数属性中.

解决这个问题

有许多解决方案,但这可能是直截了当的

JSON.stringify(err, ["message", "arguments", "type", "name"])
Run Code Online (Sandbox Code Playgroud)

这将选择您想要的属性并为您生成字符串.

  • *“修复并获取正常的错误对象”*链接现在已损坏......这就是为什么当解决方案包含其他网站上的链接时会很痛苦。不管怎样,我设法在 archive.org 中找到了一个[副本](https://web.archive.org/web/20171109022146/https://blog.sentry.io/2016/05/17/what-is-script-错误.html) (3认同)