使用ErrorBoundary创建React App不显示错误消息

Syl*_*lar 11 reactjs create-react-app

我正在学习如何使用componentDidCatch().它看起来很直接.它可以工作,但仍然在视图上显示完整的错误堆栈.

在单独的文件中:

import React, { Component } from 'react'

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

  componentDidCatch(error, info) {
    console.log("Catching an error") // this is never logged
    this.setState(state => ({...state, hasError: true }))
  }

  render() {
    if (this.state.hasError) { return <div>Sorry, an error occurred</div> }

    return this.props.children
  }
}
export default ErrorBoundary

      ...

import React, { Component } from 'react'

class Foo extends Component {

  render() {
    return this.props.a.b; // So this should cause the error
  }
}
export default Foo

      ...

import React, { Component } from 'react'
// Imported Foo and ErrorBoundary

class Home extends Component {

  render() {
    return <ErrorBoundary><Foo /></ErrorBoundary>
  }
}
export default Home
Run Code Online (Sandbox Code Playgroud)

在页面刷新时,我Sorry, an error occurred逐字逐句地看到显示给用户的完整错误堆栈.这是Create React App的问题吗?我正在使用React 16.

Shu*_*tri 7

根据github上的这个问题,

在页面刷新上,我看到抱歉,从字面上看,发生了一秒钟的错误,然后向用户显示了完整的错误堆栈。

@DanAbramov明确指出

这是故意的。意外错误仍然是错误。(我们不建议对预期的错误或控制流使用错误边界。)

错误边界主要对生产有用,但是在开发中,我们希望使错误尽可能地可见。

另外可见的错误只是一个覆盖,您的ErrorBoundary消息被隐藏在错误覆盖的后面

要检查错误是否确实存在,您可以检查元素并从DOM中删除覆盖,您将能够看到错误消息

检查此CodeSandbox

  • 这个答案可能需要我花费数百个小时来解决这个神秘问题。官方文档中没有提到这一点。 (4认同)

Jon*_*han 5

完整的错误堆栈只是在开发模式下运行应用程序时显示的一个叠加层。它不会在生产中显示。(您可以通过单击右上角的“X”按钮关闭它。)