0

Есть ли решение для сообщения о различных ошибках в приложении React Native (iOS и Android) в качестве глобального обработчика?Как сообщить о различных ошибках в приложении React Native?

Я заинтересован в следующих случаях:

  1. необработанных отбраковках
  2. Необработанных исключения
  3. ошибки на родную стороне

Сообщая, я имею в виду отправку их на какой-либо третьей стороной где вы можете отслеживать ошибки.

+0

https://stackoverflow.com/questions/30918349/how-to-catch-uncaught-exception-globally-in-react-native – gyzerok

+0

Возможный дубликат [как поймать неперехваченное исключение (глобально) в реакции native] (http://stackoverflow.com/questions/30918349/how-to-catch-uncaught-exception-globally-in-react-native) – gyzerok

ответ

2

В RN существует глобальный обработчик ErrorUtils, который обрабатывает исключенные и исключенные исключения для вашего уровня JN RN. Вы можете использовать это, чтобы установить обработчик как:

if (ErrorUtils._globalHandler) { 
      instance.defaultHandler = ErrorUtils.getGlobalHandler && ErrorUtils.getGlobalHandler() || ErrorUtils._globalHandler; 
      ErrorUtils.setGlobalHandler(instance.wrapGlobalHandler); //feed errors directly to our wrapGlobalHandler function 
     } 

И метод обработчика

async wrapGlobalHandler(error, isFatal){ 

     const stack = parseErrorStack(error); 

    //Add this error locally or send it your remote server here 

     //*> Finish activity 
     setTimeout (() => { 
     instance.defaultHandler(error, isFatal); //after you're finished, call the defaultHandler so that react-native also gets the error 
     if (Platform.OS == 'android') { 
      NodeModule.reload() 
     } 
     }, 1000); 
    } 

Обратите внимание, в коде выше необходимо создать модуль узла для андроид только и написать Реагировать Native метод моста там ваш ReactContextBaseJavaModule:

@ReactMethod 
    public void reload() { 
     Activity activity = getCurrentActivityInstance(); 
     Intent intent = activity.getIntent(); 
     activity.finish(); 
     activity.startActivity(intent); 
    } 

Спасибо!

+0

Большое спасибо! Не могли бы вы обновить свой ответ, чтобы использовать ErrorUtils.setGlobalHeader. Похоже, теперь это путь. – gyzerok

+0

Вы можете использовать его в любом компоненте JS вашей верхней иерархии компонентов JS – Akhi