2010-07-04 121 views
6

我想使用自定義異常,以便在發生任何異常時發出用戶友好的消息。攔截異常

這樣做的好方法是什麼?我應該採取什麼額外的預防措施來避免干擾Swing的EDT?

回答

6

異常翻譯:

這是一個好主意,不與沒有意義的終端用戶信息污染您的應用程序,而是創建有意義的異常和信息,這將轉化異常/錯誤發生在您的應用程序實施的深處。

根據@ Romain的評論,您可以使用Exception(Throwable cause)構造函數來跟蹤較低級別的異常。

Effective Java 2nd Edition,第61項:

[...]高層應該抓住 較低級別的例外,在其 地方,拋出異常,可以是 在higher-來解釋級別 抽象。這個成語被稱爲 異常轉換:

// Exception Translation 
    try { 
     // Use lower-level abstraction to do our bidding 
     ... 
    } catch(LowerLevelException e) { 
     throw new HigherLevelException(...); 
    } 
+2

+1只要確保您將原始異常傳遞給新構造函數,以便您可以看到完整的堆棧跟蹤以及原因。 – 2010-07-04 14:24:50

2

您可以使用java.lang.Thread.UncaughtExceptionHandler它發現你沒有照顧自己所有異常

import java.lang.Thread.UncaughtExceptionHandler; 

    public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler { 

    public void uncaughtException(Thread t, Throwable e) { 
     Frame.showError("Titel", "Description", e, Level.WARNING); 
     e.printStackTrace(); 
    } 
} 

在您的應用程序進行註冊:

public static void main(String[] args) { 
    Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); 
} 

並且在您的GUI中,您可以使用SwingX中的org.jdesktop.swingx.JXErrorPane來顯示很好的錯誤彈出窗口,通知用戶有關異常。

public static void showError(String title, String desc, Throwable e, 
     Level level) { 
    JXErrorPane.showDialog(this, new ErrorInfo(title, 
      desc, null, null, e, level, null)); 
}