關於未捕獲異常(Uncaught Exception)的處理

咱們常常使用try..catch進行異常處理,可是對於Uncaught Exception是沒辦法捕獲的。對於這類異常如何處理呢? java

回顧一下thread的run方法,有個特別之處,它不會拋出任何檢查型異常,但異常會致使線程終止運行。這很是糟糕,咱們必需要「感知」到異常的發生。好比某個線程在處理重要的事務,當thread異常終止,我必需要收到異常的報告(email或者短信)。 app

在jdk 1.5以前貌似沒法直接設置thread的Uncaught Exception Handler(具體未驗證過),但從1.5開始能夠對thread設置handler。 jvm

1. As the handler for a particular thread
當 uncaught exception 發生時, JVM尋找這個線程的異常處理器. 可使用以下的方法爲當前線程設置處理器 spa

public class MyRunnable implements Runnable {

public void run() {

// Other Code

Thread.currentThread().setUncaughtExceptionHandler(myHandler);

// Other Code

}

}


2. As the handler for a particular thread group
若是這個線程屬於一個線程組,且線程級別並未指定異常處理器(像上節As the handler for a particular thread中那樣),jvm則試圖調用線程組的異常處理器。 線程

線程組(ThreadGroup)實現了Thread.UncaughtExceptionHandler接口,因此咱們只須要在ThreadGroup子類中重寫實現便可 日誌

public class ThreadGroup implements Thread.UncaughtExceptionHandler

java.lang.ThreadGroup 類uncaughtException默認實現的邏輯以下: code

  • 若是父線程組存在, 則調用它的uncaughtException方法.
  • 若是父線程組不存在, 但指定了默認處理器 (下節中的As the default handler for the application), 則調用默認的處理器
  • 若是默認處理器沒有設置, 則寫錯誤日誌.但若是 exception是ThreadDeath實例的話, 忽略。

對應JDK的源碼: 接口

public void uncaughtException(Thread t, Throwable e) {
	if (parent != null) {
	    parent.uncaughtException(t, e);
	} else {
            Thread.UncaughtExceptionHandler ueh = 
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
		System.err.print("Exception in thread \""
				 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }

3. As the default handler for the application (JVM) 事務


Thread.setDefaultUncaughtExceptionHandler(myHandler);
不寫了,打字太累,何時能有好用的語音輸入editor.
相關文章
相關標籤/搜索