Sentry-javascript: 错误消息属性记录为[对象ErrorEvent]

创建于 2017-08-07  ·  31评论  ·  资料来源: getsentry/sentry-javascript

您是否要请求功能或报告错误
臭虫

目前的行为是什么?
有时(并非总是如此),错误的message属性记录为[object ErrorEvent] 。 我遵循了Angular中Raven的标准实现,如下所述: https :

预期的行为是什么?
查看正常的错误消息。

乌鸦3.17.0
角4.3.1
Webpack构建
不使用CLI
CDN版本

objecterrorevent

Help Wanted Needs Reproduction Bug

最有用的评论

我发现了问题。 ErrorEvent isError util函数未将ErrorEvent视为错误,可以在此处找到。 为了方便起见,我还将粘贴函数定义:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

我在控制台中进行了快速测试,以查看此函数是否对ErrorEvent返回true,但是没有:

image

isError方法中使用captureException来确定异常参数是错误还是消息。 captureException认为异常不是错误,则会使用captureMessage captureException将异常发送到仪表板。 在这种情况下,Raven将不会计算堆栈跟踪或“处理”异常。 它只是按原样发送它。

有什么原因我们不应该更新isErrorErrorEvent对象返回true吗?

所有31条评论

Angular文档中某处是否有ErrorEvent的定义? 显然,这不是以正确的方式“继承” Error

问题可能出在TraceKit的traceKitWindowOnError()方法中,似乎没有考虑到message参数可能是ErrorEvent (请参阅MDN文档

@benvinegar ErrorEvent上有一些文档: https :

也受此影响,这些用户也是如此:
https://forum.sentry.io/t/reporting-object-errorevent/1807

[email protected] (但在旧版本上也已经发生了一段时间)
角4.x
使用CLI

<script>
  undefined.foo();
</script>

^这在您的html中通过哨兵以[object ErrorEvent]登录野生动物园。 正确的消息应该是TypeError: undefined is not an object (evaluating 'undefined.foo')

我们有一个外部脚本,该脚本通过script标签注入代码以尝试创建iframe,但是被Safari阻止了。 由于错误是由注入的脚本标记引起的,因此哨兵只报告[object ErrorEvent]

报告为[object Event]哨兵另一个错误是来自flowplayer。 流程播放器确实

jQueryElement.trigger('error', [api, {code: 5}]);

您可以通过嵌入jQuery来重现它,然后执行以下操作:

$('div:first').trigger('error')

哨兵看到这样的事情
image

当然那不是很可序列化,但是像error on element from jQuery - context <div class="foo><div class="bar" ...这样的错误比[object Event]有用得多

也受此影响。

@daangeerdink @jdelaune @rosslavery @tgensol有人可以提供最小的代码来帮助我重现吗?

我刚刚检查了@sod ,在您上面提到的情况下Safari 10.1.2提供了正确的消息。

screen shot 2017-09-18 at 14 42 47

我个人无法提供复制,因为错误是如此不透明,我无法辨别代码库的哪一部分引发了错误。 我没有任何堆栈跟踪可以使用,也没有错误消息可以弄清楚这是我的代码还是第三方库等。

希望其他人可以提供一个简化的示例,对不起,我没有更多的帮助。

我们也有这个问题。 我可以共享最近10天的一些数据(此类活动22k,用户13k)。 我希望它可以帮助您重现它。
image

image

image

@kamilogorek我们有2百万个此类错误。 我认为这是我们的问题,但我们无法正确跟踪它。

我发现了问题。 ErrorEvent isError util函数未将ErrorEvent视为错误,可以在此处找到。 为了方便起见,我还将粘贴函数定义:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

我在控制台中进行了快速测试,以查看此函数是否对ErrorEvent返回true,但是没有:

image

isError方法中使用captureException来确定异常参数是错误还是消息。 captureException认为异常不是错误,则会使用captureMessage captureException将异常发送到仪表板。 在这种情况下,Raven将不会计算堆栈跟踪或“处理”异常。 它只是按原样发送它。

有什么原因我们不应该更新isErrorErrorEvent对象返回true吗?

有什么原因我们不应该更新isError为ErrorEvent对象返回true吗?

是。 因为它实际上不是Error的后代(它是Event的后代)。 例如,它没有stack属性(AFAICT,在控制台中播放)。 这意味着它可能实际上并未得到正确处理。

很高兴看到一个如何实时生成此错误的示例,以便我们可以确定如何最好地处理它。

ErrorEvent的构造函数采用Error ,因此您可以像这样轻松地处理它们:

if (isErrorEvent(ex)) {
    ex = ex.error;
}

您可以在此处查看构造定义。 特别是,请看ErrorEventInit哈希。 这是一个可选参数,所以我想我上面发布的解决方案无法处理未定义ErrorEvent.error情况。

当然,我相信这可以解决–我的意思是,这不只是增加isError来返回true

我明白。 我会在几分钟后提出公关。

已在3.19.x修复

谢谢@shcallaway! 👍

似乎我们仍在3.19.1 🤔上遇到此问题
image
image

@PhilippSpo此事件来自哪个浏览器? 在某些旧的移动浏览器和IE中不支持ErrorEvent ,因此我们不得不退回常规解决方案。

@kamilogorek Chrome 61.0.3163

我也在Chrome 61上看到了它。 😕我会尽快调查。

谢谢@shcallaway

在Safari 11.0,Mac OS 10.13上也会发生

当'message'参数是一个ErrorEvent对象时, traceKitWindowOnError似乎无法正确处理输入参数:
screen shot 2017-11-06 at 11 36 34
而“ ex”是不确定的。 然后,它使用对象(其中“消息”字段是ErrorEvent而不是字符串)来调用notifyHandlers:
screen shot 2017-11-06 at 11 41 14
当在_makeRequest中分层时,会产生无意义的消息。

感谢您的调查@ michal-rumanek,我将尽快解决此问题(本周没有空余时间)。

@kamilogorek ,有什么进展吗? ;-)

嗨,我收到了很多这样的错误[object Object]
screenshot 2017-12-01 09 41 20

角度4
铬62.0.3202
Raven-js 3.20.1

此页面是否有帮助?
0 / 5 - 0 等级