異常處理器—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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信

相關文章
相關標籤/搜索