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

How to catch unhandled errors and pass them further

我的问题是如何在 Android 应用程序中 捕获未处理的错误 进一步传递它们 所以它 确实会使应用程序崩溃

我正在为 Android 创建 SDK,我仍然希望开发人员处理他们的错误,但我也想了解我的崩溃。

我知道要捕获错误我可以使用:

        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {

        }
    });

但是如何进一步传递呢?如何崩溃应用程序?如果我使用:

throw new RuntimeException(ex);

它不会使应用程序崩溃,而是导致 ANR 错误。

第二个问题是 Fabric (Crashlytics) 如何工作? 请注意,如果应用程序中也存在 Fabric,我也不想破坏它的工作流程。

在低级别 UncaughtExceptionHandler 是一种机制,可以在 UncaughtExceptionHandler 实例附加到应用程序线程的情况下捕获所有应用程序错误。

How to crash application?

使用这个thread

It won't crash application but rather cause ANR error.

发生这种情况是因为您抛出异常并进入 uncaughtException 方法,在那里您再次抛出异常。 所以你有一个循环。

But how to pass it futher?

我想您需要将异常数据保存到某些存储设备 - 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(...) 放入您的应用程序 class 以获得最佳情况。

The second question is how does Fabric (Crashlytics) library work? Mind that I also don't want to spoil workflow of Fabric if it's also present in the application.

Fabric 还使用 UncaughtExceptionHandler 来捕获您应用中的所有错误。

如果您需要查看 logcat

中的错误

只需按 Answers 标签过滤 logcat。或者通过 System.exit

But how to pass it futher?

在调用setDefaultUncaughtExceptionHandler()之前,调用getDefaultUncaughtExceptionHandler()。在新的异常处理程序中保留旧的未捕获异常处理程序。当使用 uncaughtException() 调用您时,请执行您自己的工作并在旧处理程序上调用 uncaughtException()

How to crash application?

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