java線程莫名異常退出時,如何捕獲異常信息


之前有同事說他的程序里的線程時常莫名退出,日志中沒有任何異常信息。

目前我知道的可以獲取線程異常信息的方法主要有

1、Future<?>和ScheduledFuture<?>的get()方法

2、JAVA1.5之后支持的UncaughtExceptionHandler

1 Thread thread = new Thread(() -> {run方法內的代碼塊});
2 thread.start();
3 thread.setUncaughtExceptionHandler((t, e) -> {
4     Logger.error(t.getName() + " ERROR\t" + e.getMessage());
5 });

() -> {}是java1.8新特性中的lambda表達式

--------------------------------------------------------------------------------------------------------------------------------------------------------

然而,程序運行中可能會有不可預知錯誤,比如OOM(內存溢出)等系統錯誤,這種錯誤在java中屬於Error類,我們常用的都是Exception的子類,是捕獲不到這種異常的。

先看看一下java中異常的類圖:

RunTimeException是運行時異常,在編譯時不會被發現,比如除數為0;

Error前面說了,是系統級的錯誤,與java沒關系,所以java認為不需要捕獲這種異常,因為遇到這種異常說明系統有錯誤,已經無法支持程序正常運行,程序應該終止,沒必要捕獲和處理了。

但是對於我們開發人員和維護人員來說,我們有必要知道這些錯誤的詳細信息,來維護系統錯誤。比如,發生了OOM,我們可以看看系統里各進程占用內存情況,根據情況做整改,有可能是某程序代碼不合理,導致內存無限被占用。

Throwable就是這所有異常的父類了。

 

所以,我在同事的線程的run方法里捕獲Throwable異常來獲取異常信息。

1 @Override
2 public void run() {
3     try {
4         ...
5     } catch (Throwable t) {
6         Logger.error("xx task error!", t);
7     }
8 }

但,據說Throwable性能不佳,所以不推薦在沒必要的地方全都使用。小生目前對這方面還沒有研究,待有所了解后再補充說明。


免責聲明!

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



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