Android 拦截未处理的异常

Android Intercept Unhandled Exceptions

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

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

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

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

        }

    });

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

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

Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

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

我写的here(去掉BuildConfig.DEBUG勾选)实现直接启动邮件客户端。如果没有安装电子邮件客户端,你应该赶上 ActivityNotFoundException.