Java Thread UncaughtExceptionHandler


  有沒有發生過這樣的情況,你寫的工作線程莫名其妙的掛了,如果不是被你剛好看到,拿只能抓瞎了,不知道啥原因了,因為異常的時候只會把stack trace打在控制台上,不會記在你想記得錯誤日志里,頭皮都抓破了也沒能找到確切的地方,最后只能在能加try catch 的地方都給加上。

  Java的異常可以分為這兩類,Checked Exceptions和Unchecked Exceptions。

      checked exception例子FileNotFoundException,IOException,...

      unchecked exception例子NumberFormatException...

  我感覺第一類異常就是我們在調用java的方法時,api中指明了是有可能拋出異常,且該類異常是必須捕獲的(或向上拋出),否則代碼編譯不通過,如下:

try {
    FileOutputStream fos = new FileOutputStream(new File(""));
} catch (FileNotFoundException e) {//如果此處不進行catch則會編譯不通過
                    
}

  而第二類異常,調用某些方法時,api也提示了可能會拋出某些異常,但該類異常不是一定要捕獲的(不捕獲編譯也能通過),如下

int i = Integer.parseInt("ff");//該方法的完整聲明public static int parseInt(String s) throws NumberFormatException

  不進行try catch也一樣能運行,但運行時如果出錯,只會在控制台打印下,后面再發現程序有問題很難查找。

  其實Java已經提供了對上述第二類異常問題的處理方法,那就是為Thread設置UncaughtExceptionHandler,即對未知異常的處理,這時你就可以進行相關日志操作了,具體如何做如下:

  先創建一個實現了UncaughtExceptionHandler接口的類

class MyExceptionHandler implements UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {//在這你可以記錄相關錯誤日志到文件中
        System.out.printf("An exception has been captured\n");
      System.out.printf("Thread:%s\n", t.getName());
      System.out.printf("Exception: %s: %s:\n", e.getClass().getName(), e.getMessage());
      System.out.printf("Stack Trace:\n");
      e.printStackTrace();
      System.out.printf("Thread status:%s\n", t.getState());
    }
}

  將上述Handler的實例賦予你所建的線程

        Thread thread = new Thread(new ThreadTest1()); 
        thread.setUncaughtExceptionHandler(new MyExceptionHandler());
        thread.start();

  如果ThreadTest1中出現了未被捕獲的異常,則會執行MyExceptionHandler中的uncaughtException方法,這樣就不用死的不明不白了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM