2017-02-15 76 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回归将很难看到错误,所以我们可以修复它们。如果我从内uncaughtException(螺纹,EX)调用defaultUEH.uncaughtException(螺纹,前)将其不断循环?

  3. 与相关的是,setDefaultUncaughtExceptionHandler什么的线程?这是否适用于所有线程或例如主线程?

所以要清楚,我需要一种方式来发送每个crashlytics崩溃/异常的附加信息。怎么样 ?

更新:我看到here有人找到了解决方法,但使用这种方法并使其crashlytics报告致命问题呢?

+0

只是想知道 - 什么样的附加你需要什么信息? – maxoumime

+0

我想发送崩溃的业务逻辑。例如,应用程序状态像(令牌的UUID,在当前选项卡存在)的东西,可以更容易地重现该问题。 – j2emanue

+0

我看,你有没有使用'Crashlytics.log'考虑?通过这种方式,您可以准备与崩溃一起发送的日志,例如应用中的用户行为,他打开的活动,他选择的标签......只是一个念头 – maxoumime

回答

1

我发现了一个干净地做到这一点,它测试确定。 Crashlytics.log要在崩溃报告中发送日志。似乎不能在版本Crashlytics 2.3.14.151上始终如一地工作。我使用Crashlytics.setString(key,value)来代替。 crashlytics.log似乎与crashlytics.logException(..)正常工作。

其他问题,我不得不为它会在asychrnous异常工作。答案是肯定的,我自己测试了一下。

所以它可以捕获来自所有线程的所有异常。

想法的其余部分与here。该人在defaultExceptionHandler上使用装饰器模式向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

我改变了序列,它为我工作。 –

相关问题