Кто-нибудь знает, что лучше всего поймать все неперехваченное исключение (глобально), чтобы я мог отправить отчет о сбое на сервер? Кажется, я не могу найти какую-либо информацию о реагировании на собственные документы или на github.
Как поймать исключенное исключение (глобально) в ответном родном
Ответ 1
Вы могли бы переопределить журнал регистрации исключений, который использует React Native для разработки:
ErrorUtils.setGlobalHandler(function() {
// your handler here
});
Затем вам может понадобиться написать некоторые 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 без грациозного сообщения пользователю.