【问题标题】:React 16 Error Boundary component (using componentDidCatch) shows uncaught errorReact 16 错误边界组件(使用 componentDidCatch)显示未捕获的错误
【发布时间】:2017-10-19 17:12:51
【问题描述】:

我使用create-react-app 启动了一个应用程序,我有这个Error Boundary 组件:

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 记录的这个:“我应该看到这个记录吗??”。但我没有看到记录,它破坏了应用程序:

我是不是误会了什么?

【问题讨论】:

  • 嘿,你做的对我来说看起来不错,我刚刚测试过,但它失败了。所以我也对答案感兴趣:)
  • 我正在使用这个库js.jsnlog.com 来捕获所有错误(即使在错误处理程序中)。这就是我的错误边界组件的样子pastebin.com/aBFtD7DB

标签: javascript reactjs create-react-app


【解决方案1】:

没有发生任何事情的原因是这是事件处理程序中的错误,并且这些错误没有被错误边界捕获。 error-handling blog post 澄清了哪些错误被捕获:

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

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

编辑:actual docs 更清楚地知道捕获了哪些错误。另请注意,create-react-app 使用 react-error-overlay 包,它在 dev-server 构建上会在片刻后用错误屏幕替换整个渲染。为了更好地发现您的错误被捕获,您可以运行生产版本。

【讨论】:

  • 哦,我在文档中没有看到。在我链接到的博客文章中,该信息似乎并不明显。很高兴知道。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 2020-02-19
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多