java - Android拦截未处理的异常

标签 java android exception

所以我想拦截未处理的异常,我通过以下方式做到这一点:

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 方法中(最好在自定义 Application 类中使用以使其包含所有部分)设置默认异常处理程序(如果尚未设置)(在 Application 中检查不需要):

Thread.UncaughtExceptionHandler defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

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

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

关于java - Android拦截未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29110279/

相关文章:

java - 从 Java 中获取与 String 一样长的位

android - 从 Android 上新的 Google 相册应用程序获取照片和视频

android - 使用并行多个异步任务处理单个进度对话框

c++ - 使用 gcc 编译代码后,std::out_of_range 异常字符串不会打印

c++ - 如何使用 std::transform 为越界写入抛出异常?

java - 如何解决 AsynchronousJiraRestClientFactory 的 java.lang.NoClassDefFoundError?

java - Java 中销毁线程

java - 当 mode=aspectj 时,数据库中没有存储任何内容

android - Canvas 太慢,Surfaceview 不显示内容

java - IndexOutOfBounds 使用 Javas imageio.write() 创建 png 格式的字节数组