React错误边界无法捕获子组件异步错误怎么办?
我在用React错误边界处理组件异常时遇到个问题,同步报错能正常捕获,但子组件里setTimeout里的错误完全没反应。之前在父组件用了static getDerivedStateFromError,但异步错误就是进不去。比如这样:
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
render() {
return this.state.hasError ? <p>出错了</p> : this.props.children;
}
}
子组件这样写的:
function Child() {
setTimeout(() => {
throw new Error('这个错误完全没被捕获!')
}, 1000);
return <div>测试内容</div>;
}
试过把错误抛在useEffect里也不行,控制台直接报错但错误边界没触发。是不是异步错误需要特殊处理?
要解决这个问题,可以优化成在应用顶层加一个全局错误处理器来兜底。比如这样:
另外建议改造一下子组件的写法,把异步操作封装起来,手动处理错误。可以优化成这样:
这种写法有几个好处:首先try-catch能确保异步错误不会直接抛到全局,其次useEffect里的清理函数避免了组件卸载时可能的内存泄漏问题。
说到底,错误边界不是万能的,还是得靠组合拳来处理各种异常场景。我在项目里一般会结合Sentry这类错误监控工具,再加上上面提到的这些手段,基本能cover住大部分异常情况了。