我的问题是如何在Android应用中捕获未处理的错误,进一步传递,以便确实会崩溃应用程序。
我正在为Android创建SDK,我仍然希望开发人员处理他们的错误,但我也希望了解我的崩溃。
我知道要抓住我可以使用的错误:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
}
});
但如何进一步传递呢?如何崩溃申请?如果我使用:
throw new RuntimeException(ex);
它不会导致应用程序崩溃,而是导致 ANR 错误。
第二个问题是 Fabric(Crashlytics)库如何工作? 请注意,如果Fabric也出现在应用程序中,我也不想破坏Fabric的工作流程。
答案 0 :(得分:2)
在低级别UncaughtExceptionHandler
是捕获所有应用程序错误的机制,以防UncaughtExceptionHandler
的实例附加到应用程序线程。
如何崩溃申请?
使用此thread
它不会导致应用程序崩溃,反而导致ANR错误。
这是因为您抛出异常并进入uncaughtException
方法,再次抛出异常。 所以你有一个周期。
但如何进一步传递呢?
我想您需要将异常数据保存到某个存储空间 - SD卡,将崩溃信息发送到电子邮件等。
在这种情况下,您需要在uncaughtException
方法中实现您的逻辑
你不需要进一步传递它!
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// put your save logic here
// save to file, send to email, etc.
// Also you can get information about throwed exception
// for example : ex.getMessage();
}
});
您需要将Thread.setDefaultUncaughtExceptionHandler(...)放到Application类中以获得最佳案例。
第二个问题是Fabric(Crashlytics)库如何工作?请注意,如果Fabric也出现在应用程序中,我也不想破坏Fabric的工作流程。
Fabric还使用UncaughtExceptionHandler
来捕获应用中的所有错误。
只需按Answers
标记过滤logcat即可。或者System.exit
答案 1 :(得分:1)
但如何进一步传递呢?
在致电setDefaultUncaughtExceptionHandler()
之前,请致电getDefaultUncaughtExceptionHandler()
。抓住新的未捕获的异常处理程序。当您使用uncaughtException()
进行呼叫时,请自行完成工作,并在旧处理程序上调用uncaughtException()
。
如何崩溃申请?
我通常将一些数字除以零。