【问题标题】:Android Intercept Unhandled ExceptionsAndroid 拦截未处理的异常
【发布时间】:2015-03-17 21:43:23
【问题描述】:

所以我想拦截未处理的异常,我这样做是:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {

            //MY CUSTOM CODE TO SEND LOGS
            System.exit(2);

        }

    });

无论如何我可以执行我的自定义代码,然后恢复正常处理这些异常的方式吗?我相信我遇到了一些悬而未决的问题,因为 System.exit 似乎不能可靠地工作。

【问题讨论】:

  • 调用Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, ex) 以获得默认行为,如果这就是您的意思。见stackoverflow.com/a/23124561/115145
  • @CommonsWare 所以我基本上可以自己做逻辑,然后在我发布的上述代码中调用Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, ex)
  • 是的。这将触发正常的错误对话框,由 Android 提供并由 Play 商店(或其他设备上的其他分发渠道)增强。
  • @CommonsWare 我试过了,它似乎不会自动杀死应用程序。我只是把它挂起来。
  • 如果你完全删除你的UncaughtExceptionHandler,会发生什么?

标签: java android exception exception-handling


【解决方案1】:

您必须首先获取默认处理程序。然后拦截并将错误发送给处理程序。 System.exit... 是个坏主意。

所以首先你像以前一样创建一个自定义异常处理程序:

public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {

    private final Thread.UncaughtExceptionHandler defaultUEH;

    public CustomExceptionHandler(Thread.UncaughtExceptionHandler defaultUEH) {
            this.defaultUEH = defaultUEH;
    }
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        String stackTrace = Log.getStackTraceString(ex);
        String time = new Date(System.currentTimeMillis()).toString();
        String message = ex.getMessage();

        // send logs...

        defaultUEH.uncaughtException(thread, ex);
    }
}

所以基本上在您的 onCreate 方法中(最好在自定义应用程序类中使用它以使其属于所有部分)设置默认异常处理程序(如果尚未设置)(在应用程序中不需要检查):

Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

if (!(defaultUEH instanceof CustomExceptionHandler)) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(defaultUEH));
}

我写了here(去掉BuildConfig.DEBUG检查)实现直接启动邮件客户端。如果没有安装电子邮件客户端,你应该抓住ActivityNotFoundException

【讨论】:

  • 我明白你在做什么。 CustomExceptionHandler 如何访问defaultUEH
  • 要么在你的类中拥有类,要么使用构造函数。更新了我的答案。
  • 听起来不错,我会试一试并在我这样做后更新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2012-07-05
  • 2011-05-13
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多