美文网首页Android开发
异常捕获(二)自定义全局异常捕获

异常捕获(二)自定义全局异常捕获

作者: motosheep | 来源:发表于2021-07-18 19:31 被阅读0次

如题,本次代码在native尚未验证,只在java层进行了验证。

原理

当一个线程由于未捕获异常即将终止时,Java虚拟机将使用Thread的getuncaughtexceptionhandler()方法查询线程的uncaughtException处理程序,并调用处理程序的uncaughtException方法,将线程和异常作为参数传递。一个线程如果没有设置uncaughtExceptionHandler,将使用线程所在的线程组来处理这个未捕获异常。线程组ThreadGroup实现了UncaughtExceptionHandler,所以可以用来处理未捕获异常。

实现

定义一个类,继承Thread.UncaughtExceptionHandler,并且重写里面的uncaughtException方法,代码如下图:

public class MyCatchException implements Thread.UncaughtExceptionHandler {
    /**
     * MyCatchException实例
     */

    private static MyCatchException instance;

    /**
     * 获取MyCatchException实例 ,单例模式
     */

    public static MyCatchException getInstance() {
        if (instance == null) {
            instance = new MyCatchException();
        }
        return instance;
    }

    /**
     * 异常捕获
     */
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("全局异常捕获--start---");
        try {
            //todo 异常时相关操作
            Thread.sleep(2000);
        } catch (Exception e1) {
            System.out.println("清空用户信息异常: " + e1.getMessage());
        }
        android.os.Process.killProcess(android.os.Process.myPid());
        System.out.println("全局异常捕获--end---");
    }
}

再在项目中的application里面定义,具体实现如下图:

/**
     * bugly init
     */
    private void initBugly() {
        //设置全部异常捕获
        try {
            MyCatchException handler = MyCatchException.getInstance();
            Thread.setDefaultUncaughtExceptionHandler(handler);
            LogUtil.d("init----设置全局自定义异常捕获成功");
        } catch (Exception e) {
            LogUtil.d("init----设置全局自定义异常捕获错误: " + e.getMessage());
        }
    }

对于自定义全局异常和bugly同时使用的问题,请看我上一篇文章
bugly与自定义全局异常捕获
that's all----------------------------------------------------------------

相关文章

网友评论

    本文标题:异常捕获(二)自定义全局异常捕获

    本文链接:https://www.haomeiwen.com/subject/ryvapltx.html