【问题标题】:How to catch unhandled errors and pass them further如何捕获未处理的错误并进一步传递它们
【发布时间】:2016-05-11 03:42:14
【问题描述】:

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

【问题讨论】:

  • 很抱歉,我的 ANR 错误是由于其他原因造成的,所以它确实使应用程序崩溃。
  • 别忘了在uncaughtException结尾处退出应用程序。 Process.killProcess(Process.myPid()); System.exit(1);

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


【解决方案1】:

在低级别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
  • 你说得对,我不必重新抛出那个错误。但我担心的是,如果我用以下方法覆盖 DefaultUncaughtExceptionHandler: Thread.setDefaultUncaughtExceptionHandler() 不会破坏 Fabric 吗?
  • 在 UncaughtExceptionHandler 中吞下异常是一个危险的想法。根据发生的线程原始崩溃、Android 版本和其他因素,这会导致应用程序静默关闭(没有标准的面向用户的对话框)、继续在损坏状态下运行或产生 ANR。查看 CommonsWare 的正确答案。
  • 这种方法可能会破坏 Crashlytics。它没有机会处理异常。
【解决方案2】:

但是如何进一步传递呢?

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

如何使应用程序崩溃?

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

【讨论】:

  • 我喜欢持有对已经存在的异常处理程序的引用,但是如果在我的 SDK 之后启动结构怎么办?它会做同样的事情还是只是删除我的处理程序?
  • @AdamStyrc:“它会不会做同样的事情”——我不知道,因为我没有写 Fabric。您必须自己尝试或查看是否记录了该行为。此外,对于您自己的应用,您知道设置这些处理程序的顺序。
  • 我只是 SDK 创建者,这就是为什么我问 Fabric 是否不会抑制我的处理程序;)好的,我明白了,谢谢!
猜你喜欢
  • 2015-02-26
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多