【问题标题】:ReactJS error overlay - how do I know if error is actually caught or notReactJS 错误覆盖 - 我如何知道是否实际捕获了错误
【发布时间】:2021-09-23 18:48:50
【问题描述】:

在我的开发环境中,我的 ReactJS 应用程序有一些令人费解的行为,该应用程序使用 fetch() 进行一些 API 调用并使用 create-react-app 引导

在处理 API 调用时,我抛出了一个错误,该错误被其他地方的中间件捕获,该中间件包含每个 API 调用。

我已将console.log() 放入此中间件的catch() 块中,并确认它可以捕获所有这些错误。另外,它可以正确地向最终用户显示错误消息,并且不会使应用程序崩溃。

但奇怪的是:

  • 当我使用 throw 明确抛出错误时,ReactJS 错误叠加层会弹出并显示给我。
  • 当相同的代码在 json() 调用上抛出错误(即 API 调用没有返回有效的 JSON)时,这再次被相同的中间件捕获并且错误消息显示相同方式在 UI 中,但没有显示 ReactJS 错误覆盖。

我什至尝试明确抛出 SyntaxError 以查看会发生什么,但在这种情况下,错误叠加层确实会出现。

我的问题基本上是:这有什么可担心的吗?毕竟,错误覆盖仅在开发环境中起作用,我不确定它是否真的表明这些错误会导致生产中的崩溃/问题。我不确定它何时出现或不出现的规则是什么。是否预期覆盖不会显示未捕获的Json.parse() 错误,但会显示其他所有错误?当错误覆盖出现时,如果我可以关闭它并且应用程序本身仍然正常工作,是否有什么可担心的?

【问题讨论】:

  • .json() 发生在异步函数中,这就是它没有被中间件捕获的原因。它发生在 React 的渲染和提交阶段之外。阅读medium.com/trabe/…
  • @GabrielePetrioli 谢谢。 ...但是它似乎被中间件捕获...如果我在console.log 中捕获到来自catch() 中间件块的错误,我会看到 JSON 语法错误。这是来自 Fetch API btw 的catch()。你的意思是这就是为什么它没有被反应错误覆盖捕获?

标签: javascript reactjs create-react-app


【解决方案1】:

React 中的错误被Error Boundaries 捕获。

根据文档,他们无法捕获以下错误:

  • 事件处理程序
  • 异步代码(例如 setTimeout 或 requestAnimationFrame 回调)
  • 服务器端渲染
  • 在错误边界本身(而不是其子项)中引发的错误

fetch() 是异步代码,React 无法捕获这些错误。你应该有 try/catch 块用于 async 代码或 .catch() 处理程序用于承诺自己处理错误(例如更新 React 状态以指示发生错误并显示错误消息)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多