如何捕获未处理的错误并进一步传递它们

时间:2016-02-02 11:05:13

标签: android exception-handling crashlytics twitter-fabric crashlytics-android

我的问题是如何在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的工作流程。

2 个答案:

答案 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来捕获应用中的所有错误。

如果您需要在logcat中看到错误

只需按Answers标记过滤logcat即可。或者System.exit

答案 1 :(得分:1)

  

但如何进一步传递呢?

在致电setDefaultUncaughtExceptionHandler()之前,请致电getDefaultUncaughtExceptionHandler()。抓住新的未捕获的异常处理程序。当您使用uncaughtException()进行呼叫时,请自行完成工作,并在旧处理程序上调用uncaughtException()

  

如何崩溃申请?

我通常将一些数字除以零。