【问题标题】:Global unhandled promise rejection handler in React Native on production生产环境中 React Native 中的全局未处理承诺拒绝处理程序
【发布时间】:2020-01-06 06:06:31
【问题描述】:

我们正在开发 React Native 应用并使用带有 crashlytics 的 firebase,因此我们可以了解应用的崩溃和所有未处理的错误。

但是,我们也希望在我们的应用程序中了解所有未处理的承诺拒绝 - 因此我们希望添加全局处理程序/侦听器,以便在这种情况下将信息发送到我们的服务器。

我们已经在相应的 .catch() 块中的一些重要情况下发送了此类信息,但是如果我们将来添加新的 Promise 并忘记处理它们怎么办 - 那么我们希望接收信息而不是不知道我们的应用程序中的潜在错误。

或者这是一种不好的做法?

【问题讨论】:

  • 不是背书或任何东西,但我们使用 BugSnag 作为我们在 React Native 中的错误处理程序,它会自动捕获未处理的 Promise 拒绝并将其在线报告给他们的系统以供查看、通知等。

标签: javascript reactjs react-native promise


【解决方案1】:

您可以为此目的使用componentDidCatch。您可以包装顶级路由组件,也可以包装可能包含晦涩代码的组件。如何最好地处理应用程序崩溃取决于您。

componentDidCatch(error, errorInfo){}`

第一个方法参数是实际抛出的错误。第二个参数是一个具有componentStack 属性的对象,该属性包含组件堆栈跟踪信息。

【讨论】:

  • 但它不会在我的情况下捕获承诺中的错误。 “错误边界在渲染期间、生命周期方法中以及它们下面的整个树的构造函数中捕获错误。”
【解决方案2】:

要在全球范围内跟踪未处理的承诺拒绝,您可以使用我的 react-native-promise-rejection-utils 包:

import {
  getUnhandledPromiseRejectionTracker,
  setUnhandledPromiseRejectionTracker,
} from 'react-native-promise-rejection-utils'

const prevTracker = getUnhandledPromiseRejectionTracker()

setUnhandledPromiseRejectionTracker((id, error) => {
  console.warn('Unhandled promise rejection!', id, error)

  if (prevTracker !== undefined) {
    prevTracker(id, error)
  }
})

或者这是一种不好的做法?

总是有机会收到未在应用的业务逻辑中描述的意外错误(例如,某些第三方库引发的异常)。全局记录意外错误是一种很好的做法,因为它可以让您知道此类错误确实存在。

【讨论】:

  • 我收到了一些Possible Unhandled Promise Rejection (id: 0): TypeError: Cannot read property 'constructor' of undefined,我怎样才能找出代码中的哪个区域发生了这种情况?这个库可以吗?
  • 这个库只捕获未处理的承诺拒绝 - 其余的取决于你。
猜你喜欢
  • 2021-06-25
  • 2016-12-15
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多