Sentry 上报上来的错误展示有问题:<unknown> Non-Error exception captured with keys: errMsg。如何处理?

sentry issues 上有一种错误无法被正常解析,展示为:

<unknown>

Non-Error exception captured with keys: errMsg

这是什么原因呢?

阅读 4.2k
1 个回答

从两个方面分析sentry 错误上报:

一 手动上报

这种是我们自己手动调用上报函数来上报错误的,上报的参数一般是个 Error 对象,这个没有问题。

二 自动上报

除了手动上报外,sentry 还会自动上报为被捕获的错误,这里通常有两种情况,以 broswer 为例子:

onerror

// 捕获全局 error (不包括异步错误)
window.onerror = () => {}

onunhandledRejection

// 捕获未处理的 promise.reject 错误
window.onunhandledRejection = () => {}

Non-Error 问题原因

问题主要出现在 onunhandledRejection 这里,如果是触发了一个未捕获的 rejection, sentry 处理有以下几种情况:

  • 如果接收到的是一个ErrorEvent对象,那么直接取出它的error属性即可,这就是对应的error对象。
  • 如果接收到的是一个DOMError或者DOMException,那么直接解析出name和message即可,因为这类错误通常是使用了已经废弃的DOMAPI导致的,并不会附带上错误堆栈信息。
  • 如果接收到的是一个标准的错误对象,不做处理
  • 如果接收到的是一个普通的JavaScript对象,Sentry会将这个对象的Key序列化为字符串,然后会触发报错

比如:

javascript reject(json)// json => {data:{},result:{}}

sentry 展示:

'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys)

详细分析:https://zhuanlan.zhihu.com/p/75577689

解决方法

可以在 beforeSend 上处理一下,把不能正常解析的错误忽略掉:

Sentry.init({
           dsn: environment.sentryUrl,
           beforeSend(event, hint) {
                /* tslint:disable:no-string-literal only-arrow-functions */
                const isNonErrorException =
                    event.exception.values[0].value.startsWith('Non-Error exception captured') ||
                    hint.originalException['message'].startsWith('Non-Error exception captured');
                /* tslint:enable:no-string-literal only-arrow-functions */

                if (isNonErrorException) {
                    // We want to ignore those kind of errors
                    return null;
                }
                return event;
            }
        });

详细讨论参考这里:https://github.com/getsentry/sentry-javascript/issues/2292

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题