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

React单页应用错误捕获上报:Error Boundary替代方案咨询(CloudWatch RUM)

React + CloudWatch RUM 错误日志上报:替代Legacy Error Boundary的方案

1. 使用React官方推荐的useErrorBoundary Hook(React 18+)

React 18推出的useErrorBoundary是类组件Error Boundary的官方替代方案,完全适配函数式组件生态,能捕获组件渲染期间的错误,同时支持错误回调、重置错误状态等功能。结合CloudWatch RUM的上报逻辑示例如下:

import { useErrorBoundary } from 'react-error-boundary';
import { AwsRum } from 'aws-rum-web';

// 全局初始化CloudWatch RUM客户端
const rumClient = new AwsRum({
  appMonitorId: '你的应用监控ID',
  identityPoolId: '你的身份池ID',
  region: '你的AWS区域',
  telemetries: ['errors'],
  sessionSampleRate: 1
});

function ErrorBoundaryWrapper({ children }) {
  const { ErrorBoundary } = useErrorBoundary({
    onError: (error, errorInfo) => {
      // 上报React组件渲染错误到CloudWatch RUM
      rumClient.recordError(error, {
        componentStack: errorInfo.componentStack,
        errorType: 'react-render-error'
      });
    },
  });

  return <ErrorBoundary>{children}</ErrorBoundary>;
}

// 在App中使用包裹组件树
function App() {
  return (
    <ErrorBoundaryWrapper>
      {/* 你的应用组件内容 */}
    </ErrorBoundaryWrapper>
  );
}

2. 全局错误监听(覆盖React边界捕获不到的场景)

React错误边界(包括useErrorBoundary)只能捕获组件渲染和生命周期中的同步错误,对于异步代码、事件回调、全局脚本错误等场景需要补充全局监听:

// 在应用入口文件添加全局监听逻辑
import { AwsRum } from 'aws-rum-web';

const rumClient = new AwsRum({ /* 初始化配置 */ });

// 捕获全局同步脚本错误
window.onerror = (message, source, lineno, colno, error) => {
  rumClient.recordError(error || new Error(message), {
    source,
    line: lineno,
    column: colno,
    errorType: 'global-sync-error'
  });
  return true;
};

// 捕获未处理的Promise拒绝
window.addEventListener('unhandledrejection', (event) => {
  rumClient.recordError(event.reason, {
    errorType: 'unhandled-promise-rejection'
  });
  event.preventDefault();
});

3. 启用CloudWatch RUM原生自动错误捕获

CloudWatch RUM的Web客户端本身支持自动捕获多种前端错误,无需手动编写大量捕获逻辑,开启后可自动捕获:

  • React组件渲染错误
  • 资源加载错误(如JS/CSS/图片加载失败)
  • 网络请求错误(Fetch/XHR失败)
  • 全局脚本错误

初始化时开启错误遥测即可:

import { AwsRum } from 'aws-rum-web';

new AwsRum({
  appMonitorId: '你的应用监控ID',
  identityPoolId: '你的身份池ID',
  region: '你的AWS区域',
  telemetries: ['errors', 'performance', 'http'], // 明确开启错误遥测
  sessionSampleRate: 1,
  allowCookies: true
});

方案组合建议

将以上三种方案结合使用:

  • 用useErrorBoundary处理React组件树内的渲染错误,保留组件级别的错误隔离能力
  • 全局监听补全异步和非React上下文的错误
  • CloudWatch RUM原生捕获作为兜底,确保不遗漏任何未被手动捕获的错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:40:14