React16 引入了 Error Boundaries 即异常边界概念,以及两个新的生命周期函数,来支持 React 运行时的异常捕获和处理。:
componentDidCatch(err, info):此生命周期在后代组件抛出错误后被调用。static getDerivedStateFromError(err):此生命周期会在后代组件抛出错误后被调用。 它将抛出的错误作为参数,并返回一个值以更新 stateReact16 用于捕获异常的 Hook:
useDebugValue
什么是错误边界
React16 引入了 Error Boundaries(异常边界)的概念是为了避免 React 的组件内的 UI 异常导致整个应用的异常。
Error Boundaries(异常边界)是 React 组件,用于捕获它子组件树种所有组件产生的 js 异常,并渲染指定的兜底 UI 来替代出问题的组件。
它能捕获子组件生命周期函数中的异常,包括构造函数(constructor)和 render 函数
而不能捕获以下异常:
- Event handlers(事件处理函数)
 - Asynchronous code(异步代码,如 setTimeout、promise 等)
 - Server side rendering(服务端渲染)
 - Errors thrown in the error boundary itself (rather than its children)(异常边界组件本身抛出的异常)
 
import React from 'react';class ErrorBoundary extends React.Component {state = {hasError: false}componentDidCatch(err, info) {this.setState({ hasError: true })console.log(err, info);}render() {// 如果 render 阶段出现问题,那么使用一个兜底的 UIif (this.state.hasError) {return <div>Something went wrong</div>}return this.props.children}}export default ErrorBoundary
使用 ErrorBoundary 组件的方式,将组件嵌套在 ErrorBoundary 组件中
import React from 'react'import ErrorBoundary from '@/components/ErrorBoundary'class TodoList extends React.Component {render() {return new Error('TodoList is Error')}}class Page extends React.Component {render() {return (<ErrorBoundary><TodoList/></ErrorBoundary>)}}
