咱們常常使用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
對應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.