You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中Sentry captureException无法捕获完整嵌套错误对象求助

解决NextJS中Sentry captureException无法记录错误嵌套字段的问题

核心原因

标准Error对象仅包含message、stack等默认属性,自定义嵌套字段(如业务错误的details、code等)默认不会被Sentry自动序列化捕获;部分第三方库返回的错误对象(如Axios错误)的附加属性也可能未被Sentry处理。

可行解决方案

方案1:单个catch块手动附加上下文

在捕获错误时,通过Sentry.withScope手动提取嵌套字段并作为额外上下文提交:

catch (error) {
  console.error("完整错误信息:", error);

  // 提取需要的嵌套字段(根据你的错误结构调整)
  const customErrorFields = {
    ...(error.details && { details: error.details }),
    ...(error.response && { response: error.response }),
    ...(error.code && { code: error.code })
  };

  Sentry.withScope(scope => {
    // 将嵌套字段添加到Sentry事件的extra中
    scope.setExtra("customErrorData", customErrorFields);
    
    // 确保捕获的是标准Error实例(非Error对象先包装)
    const targetError = error instanceof Error ? error : new Error(JSON.stringify(error));
    Sentry.captureException(targetError);
  });
}

方案2:全局配置自动处理所有错误

在Sentry初始化时添加beforeSend钩子,自动提取所有错误的嵌套字段,无需在每个catch块重复处理:

import * as Sentry from '@sentry/nextjs';

Sentry.init({
  dsn: '你的Sentry DSN',
  // 其他初始化配置(如环境、采样率等)
  
  beforeSend(event, hint) {
    const originalError = hint.originalException;
    if (!originalError || typeof originalError !== 'object') return event;

    // 处理非标准Error对象
    if (!(originalError instanceof Error)) {
      event.extra = {
        ...event.extra,
        rawError: originalError
      };
      hint.originalException = new Error(JSON.stringify(originalError));
      return event;
    }

    // 提取标准Error上的自定义嵌套字段
    const extraFields = {};
    Object.getOwnPropertyNames(originalError).forEach(key => {
      // 排除Sentry已默认处理的字段
      if (!['message', 'stack', 'name'].includes(key)) {
        extraFields[key] = originalError[key];
      }
    });

    if (Object.keys(extraFields).length > 0) {
      event.extra = {
        ...event.extra,
        customErrorFields: extraFields
      };
    }

    return event;
  }
});

注意事项

  • 若错误来自第三方库(如Axios),需确认其附加属性(如response、config)是否可枚举,不可枚举的字段需通过Object.getOwnPropertyNames或Object.getOwnPropertyDescriptors提取。
  • 避免直接将非Error对象传入captureException,优先包装为标准Error实例,保证Sentry能正确解析栈信息。

内容的提问来源于stack exchange,提问作者Aditya Shrivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:20:42