2017-02-15 4 views
1

Использование Java (android, но это вопрос Java). Я создал обработчик исключений по умолчанию в классе приложения, например, более или менее, который был взят из некоторого SO резьба:Crashlytics в Android - как фиксировать все исключения/сбои в одном месте

public class MyApplication extends Application { 
@Override 
    public void onCreate() { 
     super.onCreate(); 
     AppInitialization(); 
    } 

    private void AppInitialization() { 
     defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 
     Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler); 
    } 

    private UncaughtExceptionHandler defaultUEH; 

    // handler listener 
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      ex.printStackTrace(); 
      // TODO handle exception here 
     } 
    }; 
} 

Позволяет рассказать о том, что моя цель. Мне нужно записать дополнительную информацию для краш-отчетов crashLytics. поэтому в любое время возникает исключение hook uncaughtException (Thread thread, Throwable ex). Я предполагаю, что это будет работать для сбоев и исключений (не уверен).

3 вопроса по этому поводу:

  1. это повлияет как crashLytics работает с им overrding обработчик исключений по умолчанию.

  2. Будет ли это позволять приложению продолжать - я не хочу этого. Я хочу только зарегистрировать исключение в другом месте и продолжить его, как будто defaultexceptionHandler не существует. В противном случае регрессия QA будет нелегко увидеть ошибки, чтобы мы могли их исправить. Если я вызову defaultUEH.uncaughtException (поток, ex) изнутри uncaughtException (thread, ex), он будет продолжать цикл?

  3. Какой поток связан с setDefaultUncaughtExceptionHandler? это работает для всех потоков, например, или только для основного потока?

Чтобы быть ясным, мне нужен способ отправить дополнительную информацию о каждом сбое/исключении crashlytics. Как ?

ОБНОВЛЕНИЕ: Я вижу here, что кто-то нашел решение, но используя этот метод, он также делает крашетики сообщать о фатальных проблемах?

+0

Просто интересно - какая дополнительная информация вам нужна? – maxoumime

+0

Я хочу отправить бизнес-логику с крахом. Например, приложения, такие как (токены, UUID, текущая вкладка), могут упростить воссоздание проблемы. – j2emanue

+0

Вижу, вы считали использование 'Crashlytics.log'?Таким образом, вы можете подготовить журналы, которые будут отправлены с крахом, такие как поведение пользователя в приложении, действия, которые он открыл, вкладки, которые он выбрал ... Просто мысль – maxoumime

ответ

1

Я нашел способ сделать это чисто, и он проверяет нормально. будьте осторожны с Crashlytics.log для отправки журналов во время отчета о сбое. похоже, не работает последовательно на версии Crashlytics 2.3.14.151. Вместо этого я использую Crashlytics.setString (ключ, значение). crashlytics.log, похоже, отлично работает с crashlytics.logException (..).

Другой вопрос, который был у меня был, будет ли он работать над исключениями из ашрама. Ответ - да, я сам это испытал.

поэтому он ловит все исключения из всех нитей.

Остальная идея аналогична here. Человек использует шаблон декоратора над стандартнымExceptionHandler, чтобы добавить функциональность к методу uncaughtException.

это, как я усиливается его:

public class DefaultUnCaughtExceptionHandlerDecorator implements UncaughtExceptionHandler { 

    private UncaughtExceptionHandler mDefaultUncaughtExceptionHandler; //we will decorate the default handler to add functionality to it 

    public DefaultUnCaughtExceptionHandlerDecorator(UncaughtExceptionHandler mDefaultUncaughtExceptionHandler) { 
     this.mDefaultUncaughtExceptionHandler = mDefaultUncaughtExceptionHandler; 
    } 

    @Override 
    public void uncaughtException(Thread t, Throwable e) { 

     logToCrashLytics(); //add our crashlytics logging and keys here 
     // we have added our crashlytics extra data, now invoke Crashlytics 
     mDefaultUncaughtExceptionHandler.uncaughtException(t, e); 
    } 

    private void logToCrashLytics() { 

      Crashlytics.setUserIdentifier(Model.getUserID());//or whatever. this will show directly on crashlytics dashboard a pretty element 

     Crashlytics.setString("Some useful Info","user is logged in"); // or whatever you want, such as printing out singleton managers references or model info 
    //dont use Crashlytics.Log(..) here. it wont work consistent. 
    } 

}

теперь в вашем подклассе класса приложения после crashlytics установлен сделать это:

Thread.setDefaultUncaughtExceptionHandler(new DefaultUnCaughtExceptionHandlerDecorator(Thread.getDefaultUncaughtExceptionHandler())); 
+0

Я изменил последовательность, и это сработало для меня. –

Смежные вопросы