Expo+React Native中Sentry捕获非Error对象的显示问题
解决Expo React Native中Sentry完整捕获非Error对象的问题
方法1:将非Error对象转为Error实例并附加额外信息
Sentry对原生Error对象的解析更完善,你可以把非Error对象的内容转成Error的message,同时将原对象的所有属性作为extra传入,这样控制台既能看到错误提示,又能查看完整属性值:
function captureNonErrorException(obj) { // 把对象序列化为字符串作为Error的消息 const error = new Error(JSON.stringify(obj)); // 将原对象属性全部放入extra字段 Sentry.Native.captureException(error, { extra: { ...obj } }); } // 使用示例 const frameworkError = { code: 'INVALID_INPUT', message: '邮箱格式错误', details: { field: 'email' } }; captureNonErrorException(frameworkError);
方法2:用captureMessage直接记录并附加对象
如果不需要堆栈跟踪,仅需记录非Error对象的内容,可以使用captureMessage,并将对象作为extra传入,同时标记错误级别:
function captureNonError(obj) { Sentry.Native.captureMessage('非Error类型异常', { extra: { ...obj }, level: 'error' // 保持和exception一致的错误级别 }); }
方法3:全局配置beforeSend自动处理非Error对象
通过Sentry初始化时的beforeSend钩子,可以全局拦截并转换非Error对象,不用每次调用都手动处理:
import * as Sentry from '@sentry/react-native'; Sentry.init({ dsn: '你的DSN', // 其他初始化配置 beforeSend(event, hint) { // 检查是否是Sentry提示的非Error异常 if (event.exception?.values?.[0]?.value?.includes('Non-Error exception captured')) { const originalObj = hint.originalException; // 确认是对象且不是Error实例 if (originalObj && typeof originalObj === 'object' && !(originalObj instanceof Error)) { // 更新事件的message和extra字段 event.message = JSON.stringify(originalObj); event.extra = { ...event.extra, ...originalObj }; // 替换异常的显示文本 event.exception.values[0].value = JSON.stringify(originalObj); } } return event; } });
注意事项
- 如果对象存在循环引用,
JSON.stringify会失败,这时可以用flatted这类库进行序列化,或者手动剔除循环引用的属性。 - 确保Expo项目中Sentry集成正确:已安装
@sentry/react-native,并配置了Expo的Sentry插件(expo install @sentry/react-native)。
内容的提问来源于stack exchange,提问作者Antoine Sindhu
相关产品推荐
相关产品推荐

