React 16 错误边界组件(使用 componentDidCatch)显示未捕获的错误

IT技术 javascript reactjs create-react-app
2021-04-30 12:47:10

我使用create-react-app启动了一个应用程序,我有这个错误边界组件:

import React from 'react'

export default class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  componentDidCatch(error, info) {
    console.log('shouldnt I see this logged??')

    this.setState({ hasError: true });
  }

  render() {
    if (this.state.hasError) {
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children;
  }
}

我在这个 App 组件中使用它:

import React from 'react'
import ErrorBoundary from './ErrorBoundary'


class App extends React.Component {
  render() {
    return (
      <ErrorBoundary>
        <div>
          <button onClick={() => { throw new Error('lets throw an error') }}>
            Click to throw error
          </button>
        </div>
      </ErrorBoundary>
    );
  }
}

export default App;

我期待如果我单击 中的按钮App,应该捕获抛出的错误,并且我应该看到这个记录来自ErrorBoundary:“我应该看到这个记录吗??”。但我没有看到记录并且它破坏了应用程序:

在此处输入图片说明

我误解了什么吗?

2个回答

什么都没有发生的原因是这是事件处理程序中的错误,并且这些没有被错误边界捕获。错误处理博客中澄清了错误被发现:

错误边界在渲染过程中、生命周期方法中以及在它们下面的整个树的构造函数中捕获错误。

如果没有错误边界,这些错误将非常难以捕捉(在 React 16 中,即使是生命周期方法错误也会使您的整个应用程序渲染消失。)

编辑:实际文档更清楚地说明了哪些错误被捕获。另请注意,create-react-app使用react-error-overlay包,它在开发服务器构建上会在片刻之后用错误屏幕替换整个渲染。为了更好地看到您的错误被捕获,您可以运行生产版本。

错误边界不会捕获以下错误:

  1. 项目清单
  2. 事件处理程序
  3. 异步代码(例如 setTimeout 或 requestAnimationFrame 回调)
  4. 服务端渲染
  5. 在错误边界本身(而不是其子项)中抛出的错误