Подтвердить что ты не робот

Как поймать исключенное исключение (глобально) в ответном родном

Кто-нибудь знает, что лучше всего поймать все неперехваченное исключение (глобально), чтобы я мог отправить отчет о сбое на сервер? Кажется, я не могу найти какую-либо информацию о реагировании на собственные документы или на github.

4b9b3361

Ответ 1

Вы могли бы переопределить журнал регистрации исключений, который использует React Native для разработки:

ErrorUtils.setGlobalHandler(function() {
// your handler here
});

https://github.com/facebook/react-native/blob/522fd33d6f3c8fb339b0dde35b05df34c1233306/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js#L46

Затем вам может понадобиться написать некоторые Obj-C, которые вы выставляете JS, в зависимости от ваших точных требований.

Ответ 2

Вот как я это сделаю:

Шаг 1: Мы перехватываем обработчик обработчика реакции, например:

//intercept react-native error handling
if (ErrorUtils._globalHandler) {
  this.defaultHandler = ErrorUtils.getGlobalHandler && ErrorUtils.getGlobalHandler() || ErrorUtils._globalHandler;
  ErrorUtils.setGlobalHandler(this.wrapGlobalHandler);  //feed errors directly to our wrapGlobalHandler function
}

Шаг 2: Теперь наш wrapGlobalHandler вызывается всякий раз, когда возникает необработанная ошибка. Так что сделайте все, что хотите, с ошибкой внутри этой функции.

Затем сделайте что-нибудь с ошибкой:

async function wrapGlobalHandler(error, isFatal){

    const stack = parseErrorStack(error);

    //do anything with the error here

    this.defaultHandler(error, isFatal);  //after you're finished, call the defaultHandler so that react-native also gets the error
}

Полный код здесь:

import stacktraceParser from 'stacktrace-parser';


const parseErrorStack = (error) => {
    if (!error || !error.stack) {
        return [];
    }
    return Array.isArray(error.stack) ? error.stack :
    stacktraceParser.parse(error.stack);
};


// intercept react-native error handling
if (ErrorUtils._globalHandler) {
    this.defaultHandler = (ErrorUtils.getGlobalHandler
        && ErrorUtils.getGlobalHandler())
        || ErrorUtils._globalHandler;
    ErrorUtils.setGlobalHandler(this.wrapGlobalHandler); // feed errors directly to our wrapGlobalHandler function
}

async function wrapGlobalHandler(error, isFatal) {

    const stack = parseErrorStack(error);

    //do anything with the error here

    this.defaultHandler(error, isFatal);  //after you're finished, call the defaultHandler so that react-native also gets the error
}

Вот оно!

Ответ 3

Существует собственный способ.

RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:_scriptURL
                                      moduleProvider:^{
                                        id<RCTExceptionsManagerDelegate> customDelegate = ...
                                        return @[[RCTExceptionsManager initWithDelegate:customDelegate];
                                      }
                                       launchOptions:nil];

Просто поставьте логику отчета в customDelegate.

Ответ 4

Там теперь react-native-error-reporter, что в значительной степени делает трюк очень простым способом:

npm i react-native-error-reporter --save
rnpm link

Затем добавьте эти строки в свой код:

import ErrorReporter from 'react-native-error-reporter';
ErrorReporter.init("[email protected]", "My App Crash Report");

Если вы используете Redux, вы можете попробовать redux-catch промежуточное программное обеспечение.

Ответ 5

Вы можете попробовать https://github.com/master-atul/react-native-exception-handler.

Активировать собственный модуль, который позволяет вам регистрировать глобальный обработчик ошибок, который может захватывать фатальные/нефатальные неперехваченные исключения. Модуль помогает предотвратить резкий сбой приложений RN без грациозного сообщения пользователю.