5

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

4

2 回答 2

2

UncaughtExceptionHandler如果实例UncaughtExceptionHandler附加到应用程序线程,则在低级别是捕获所有应用程序错误的机制。

如何使应用程序崩溃?

使用这个线程

它不会使应用程序崩溃,而是导致 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

于 2016-02-02T11:15:27.073 回答
2

但是如何进一步传递呢?

打电话之前setDefaultUncaughtExceptionHandler(),先打电话getDefaultUncaughtExceptionHandler()。在新的异常处理程序中保留旧的未捕获异常处理程序。当你被调用时uncaughtException(),做你自己的工作并调用uncaughtException()旧的处理程序。

如何使应用程序崩溃?

我通常将某个数字除以零。

于 2016-02-02T11:35:23.537 回答