首页 > 解决方案 > master-atul/react-native-exception-handler - 不捕获 node_modules 中的错误

问题描述

我只能让它在应用程序级别解决问题,如果从 node_modules 中的任何包中抛出错误,它不会被捕获。

下面是我的 GlobalErrorHandler,我已将它导入到我的应用程序顶部的 app.js 文件中,因此希望它能够捕获应用程序中的任何异常。

预期的行为是由 globalErrorHandlerthis.test()抛出和捕获异常node_modules/AnotherUIDependency

应用程序.js

...
import { GlobalErrorHandler } from 'MASKED/globalErrorHandler'
...

globalErrorHandler.js

import { Alert } from 'react-native'
import { GlobalStrings } from 'MASKED'
import RNExitApp from 'react-native-exit-app'
import {
  setJSExceptionHandler,
  setNativeExceptionHandler
} from 'react-native-exception-handler'

errorHandler = (e, isFatal) => {
  Alert.alert(
    GlobalStrings.globalErrorHandler.title,
    // eslint-disable-next-line no-undef
    errorMessage(e, isFatal, __DEV__),
    [
      {
        text: GlobalStrings.globalErrorHandler.exit,
        onPress: () => {
          RNExitApp.exitApp()
        }
      }
    ],
    { cancelable: false }
  )
}

errorMessage = (e, isFatal, isDev) => {
  let val = null
  if (isDev) {
    val =
      GlobalStrings.globalErrorHandler.error +
      `: ${isFatal ? GlobalStrings.globalErrorHandler.fatal : ''}` +
      '\n\n' +
      e.name +
      ':' +
      e.message
  } else {
    if (!isFatal) {
      val = GlobalStrings.globalErrorHandler.exceptionMessage
    } else {
      val = GlobalStrings.globalErrorHandler.nonFatal + ': ' + e
    }
  }
  return val
}

setJSExceptionHandler(errorHandler, true)
setNativeExceptionHandler(errorString => {
  Alert.alert(
    GlobalStrings.globalErrorHandler.nativeExceptionMessage + ': ' + errorString
  )
})

node_modules/AnotherUIDependency

...
export default class myComponent extends Component {
    render(
        return{
            this.test() // expected globalErrorHandler capture
            ...
        }
    )
}

标签: javascriptreact-native

解决方案


关于如何获取模块,您错了。

捕获JS_Exceptions 的用法

import {setJSExceptionHandler, getJSExceptionHandler} from 'react-native-exception-handler';

.
.
// For most use cases:
// registering the error handler (maybe u can do this in the index.android.js or index.ios.js)
setJSExceptionHandler((error, isFatal) => {
  // This is your custom global error handler
  // You do stuff like show an error dialog
  // or hit google analytics to track crashes
  // or hit a custom api to inform the dev team.
});
//=================================================
// ADVANCED use case:
const exceptionhandler = (error, isFatal) => {
  // your error handler function
};
setJSExceptionHandler(exceptionhandler, allowInDevMode);
// - exceptionhandler is the exception handler function
// - allowInDevMode is an optional parameter is a boolean.
//   If set to true the handler to be called in place of RED screen
//   in development mode also.

// getJSExceptionHandler gives the currently set JS exception handler
const currentHandler = getJSExceptionHandler();

捕捉Native_Exceptions

import { setNativeExceptionHandler } from "react-native-exception-handler";

//For most use cases:
setNativeExceptionHandler(exceptionString => {
  // This is your custom global error handler
  // You do stuff likehit google analytics to track crashes.
  // or hit a custom api to inform the dev team.
  //NOTE: alert or showing any UI change via JS
  //WILL NOT WORK in case of NATIVE ERRORS.
});
//====================================================
// ADVANCED use case:
const exceptionhandler = exceptionString => {
  // your exception handler code here
};
setNativeExceptionHandler(
  exceptionhandler,
  forceAppQuit,
  executeDefaultHandler
);
// - exceptionhandler is the exception handler function
// - forceAppQuit is an optional ANDROID specific parameter that defines
//    if the app should be force quit on error.  default value is true.
//    To see usecase check the common issues section.
// - executeDefaultHandler is an optional boolean (both IOS, ANDROID)
//    It executes previous exception handlers if set by some other module.
//    It will come handy when you use any other crash analytics module along with this one
//    Default value is set to false. Set to true if you are using other analytics modules.

推荐阅读