异常处理器—UncaughtExceptionHandler

介绍

程序总有崩溃的时候,崩溃没关系,只要找出问题解决就好。可是对于普通用户手中的崩溃,咱们每每没办法及时获取用户当时的crash信息。这时候咱们就要用到异常处理器,经过实现UncaughtExceptionHandler接口,重写uncaughtException方法来处理代码内部未捕获的异常,也就是运行崩溃异常。java

使用

public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private static volatile CrashHandler crashHandler;

    private Context context;

    private CrashHandler(){}

    public void init(Context context){
        this.context = context;
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    public static CrashHandler getCrashHander(){
        if (crashHandler == null){
            synchronized (CrashHandler.class){
                if (crashHandler == null){
                    crashHandler = new CrashHandler();
                }
            }
        }
        return crashHandler;
    }

    @Override
    public void uncaughtException(Thread t, final Throwable e) {
        //程序崩溃了,获取错误信息 e.getMessage()
        //能够进行保存或者上传到服务器

        android.os.Process.killProcess(android.os.Process.myPid())
        exitProcess(1)
    }
}


public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        CrashHandler crashHandler = CrashHandler.getCrashHander();
        crashHandler.init(this);
    }
}

其实重要的就是两步:android

  • 首先实现 UncaughtExceptionHandler接口,而后在他的 uncaughtException方法中获取异常信息,能够进行保存或者上传到服务器进行错误信息分析。
  • 而后经过Thread的 setDefaultUncaughtExceptionHandler方法,将当前类设置成线程默认的异常处理器,而后就能监听到全部线程的错误信息了。

原理

通常状况下,一个应用中所使用的线程都是在同一个线程组,而在这个线程组里只要有一个线程出现未被捕获异常的时候,JAVA 虚拟机就会调用当前线程所在线程组中的 uncaughtException()方法。web

// ThreadGroup.java
public void uncaughtException(Thread t, Throwable e) {
    if (parent != null) {
        parent.uncaughtException(t, e);
    } else if (Thread.getDefaultUncaughtExceptionHandler() != null) {
        // TODO The spec is unclear regarding this. What do we do?
        Thread.getDefaultUncaughtExceptionHandler().uncaughtException(t, e);
    } else if (!(e instanceof ThreadDeath)) {
        // No parent group, has to be 'system' Thread Group
        e.printStackTrace(System.err);
    }
}

而后这个方法就比较简单了,当getDefaultUncaughtExceptionHandler() 方法所获取的异常处理器不为空时,就会把异常传到uncaughtException方法中。因此咱们以前经过setDefaultUncaughtExceptionHandler方法设置了异常处理器为咱们本身的CrashHandler,异常就会回调给CrashHandler的uncaughtException方法。服务器


本文分享自微信公众号 - 码上积木(Lzjimu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。微信

相关文章
相关标签/搜索