Android拦截未处理的异常

时间:2015-03-17 21:43:24

标签: java android exception exception-handling

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

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

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

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

        }

    });

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

1 个答案:

答案 0 :(得分:2)

您必须先获取默认处理程序。然后拦截并发送错误处理程序。 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方法中(最好在自定义Application类中使用它使它落入所有部分)设置默认的异常处理程序(如果尚未设置)(在Application中不需要检查):

Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

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

我写了here(删除BuildConfig.DEBUG检查),直接启动电子邮件客户端。如果没有安装电子邮件客户端,则应该捕获ActivityNotFoundException