当前位置: 首页 > 知识库问答 >
问题:

reactjs try catch in render不捕获子级错误

拓拔泓
2023-03-14

我正在尝试将错误捕获添加到组件的渲染函数中。当我在实际的渲染函数中抛出错误时,这可以正常工作,但是如果组件的子级中存在错误,则尝试不会捕获错误(或者它们被子组件错误处理程序拦截,我不确定?

是否存在将错误强制到父级的方法。

const SimpleComponent = React.createClass({
    render: function(){
        try{
            throw 'new error'
            return <div>{this.props.children}</div>
        }catch(e){
            console.log('error', e);        
        }
    }
})

上述工作

const SimpleComponent = React.createClass({
    render: function(){
        try{
            return <div>{this.props.children}</div>
        }catch(e){
            console.log('error', e);        
        }
    }
})

const ChildComponent = React.createClass({
    render: function(){
        throw 'child error'
    }
})

<SimpleComponent>
    <ChildComponent />
</SimpleComponent>

这上面不抓

共有3个答案

景育
2023-03-14

我建议在父组件中使用(当前)不稳定的生命周期事件unstable_handleError

public unstable_handleError(err: any) {

  this.setState({
    error: err
  });

}

在未来的版本中,错误挂钩可能会成为官方API。详情见本期

https://github.com/facebook/react/issues/2461

彭鸿哲
2023-03-14

您可以利用React的BatchingStrategyAPI轻松地将<code>try/catch<code>包装在所有React代码周围。此窗口的好处在于<code>窗口。onerror是,在所有浏览器中都可以获得很好的堆栈跟踪。即使是像Microsoft Edge和Safari这样的现代浏览器也不提供对window.onerror的堆栈跟踪。

请注意,此解决方案并不总是防止React进入不良状态。但是,此解决方案至少允许您处理错误,例如显示错误横幅/模式,或将堆栈跟踪错误日志发送到您的服务。

以下是React 15.4的外观:

import ReactUpdates from "react-dom/lib/ReactUpdates";
import ReactDefaultBatchingStrategy from "react-dom/lib/ReactDefaultBatchingStrategy";

let isHandlingError = false;
const ReactTryCatchBatchingStrategy = {
  // this is part of the BatchingStrategy API. simply pass along
  // what the default batching strategy would do.
  get isBatchingUpdates () { return ReactDefaultBatchingStrategy.isBatchingUpdates; },

  batchedUpdates (...args) {
    try {
      ReactDefaultBatchingStrategy.batchedUpdates(...args);
    } catch (e) {
      if (isHandlingError) {
        // our error handling code threw an error. just throw now
        throw e;
      }

      isHandlingError = true;
      try {
        // replace this with whatever error handling logic you like.
        // e.g. dispatch redux action notifying the app that an error occurred:
        // `store.dispatch({type: "EXCEPTION", payload: e});`
        console.error(e);
      } finally {
        isHandlingError = false;
      }
    }
  },
};

ReactUpdates.injection.injectBatchingStrategy(ReactTryCatchBatchingStrategy);

完整文章在这里:https://engineering.classdojo.com/blog/2016/12/10/catching-react-errors/

茅才
2023-03-14

使用反应16中的组件DidCatch()方法

查看更多信息

 类似资料:
  • 有什么方法可以捕获“删除级联”事件吗?我在Debezium常见问题解答(在页面底部)中读到: ==为什么在某些情况下我看不到删除事件? 这可能是使用语句造成的。在本例中,数据库https://dev.mysql.com/doc/refman/5.7/en/innodb-and-mysql-replication.html生成的删除事件[不是binlog的一部分],因此Debezium无法捕获。 我

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 我在PHP中遇到了一个奇怪的问题,与symfony 1.4 我有一个启动多个工作线程的任务,有时,我需要停止所有工作线程(例如,在部署之后)。 我使用开始停止守护程序启动任务,我想通过向它发送信号SIGINT来停止它。 所以,这是我的代码: 我所做的非常简单:我分叉,创建N个子进程,在父进程中,我添加一个pcntl_signal来捕获SIGINT信号。signalHanlder函数检索子PID的列

  • 我已经写了一个节点。使用express框架的jsapi。我正在使用wait和async。我在try-catch块中捕获异步函数。但是,在catch(err)方法中,不会返回err。 在上面的例子中,我故意调用一个不存在的函数,这样它就会抛出一个错误。 我得到的答复如下。它正在命中catch块,但没有将错误添加到数据对象中。 但是,如果我将下面的行移出try catch块。控制台将抛出以下错误。 所

  • 我无法用axios捕捉错误响应。怎么做?我用的是: 我看到ajax请求的结果有400个状态代码,响应主体看起来像(Django后端)。没关系,我已经准备好在catch处理程序中处理这些错误了。 但是它们转到成功处理程序。为何如此?我在控制台中看到以下输出: 成功处理程序接收axios错误对象作为结果。为什么会这样,下一步该怎么办?此错误对象不包含任何有用信息。 UPD。实际上,错误对象包含有用的信

  • 我有一个应用程序使用了log4j1.2.17,现在我想把它更改为log4j2。所以我更改了pom.xml(我确信我已经删除了任何依赖项中的log4j1),添加了log4j2.xml。log4j2工作得很好,它记录了我想要的信息。 我查看log4j的问题。LOG4J2-2026似乎可以解决这个问题,但是我使用的log4j2版本已经是2.9.1了。我不知道是什么原因造成这个错误。