小能豆

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

javascript

我正在学习如何使用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

刷新页面时,我看到Sorry, an error occurred一秒钟后,完整的错误堆栈才显示给用户。这是 Create React App 的问题吗?我使用的是 React 16。


阅读 42

收藏
2024-06-25

共1个答案

小能豆

根据github 上的这个问题,

在页面刷新时,我看到“抱歉,发生了一个错误”,实际上,一秒钟后,完整的错误堆栈就显示给用户。

@DanAbramov 已经明确表示

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

错误边界主要用于生产,但在开发中我们希望使错误尽可能明显。

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

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

2024-06-25