簡介 Java EE 例外處理


Java 的 例 外的繼承架構 中,分為Checked Exception、Unchecked Exception,Checked Exception需要您使用try-catch或throws加以處理方可通過編譯,Unckecked Exception是RuntimeException的子類別,屬於執行時期例外,不需要特別使 用try-catch或throws加以處理也可通過編譯,Error的子類別亦是 Unchecked Exception,屬於系統方面的嚴重錯誤,不需也不希望您特別處理。

在Java EE中,對EJB的例外則是區分為System Exception、Application Exception,分類上較為複雜,並非以Checked Exception、Unchecked Exception來區分。
  • System Exception
System Exception是在容器提供服務給EJB元件時因發生錯誤而引發的例外,可能是RuntimeException子類、 RemoteException或EJBException等。

基本上繼承RuntimeException的子類別大都可歸類為System Exception(除了使用@ApplicationException標註的RuntimeException子類外),System Exception也可以是EJB元件的商務方法或MDB的onMessage()方法所丟出的例外,。

RemoteException(IOException子類)雖然是Checked Exception,不過在EJB2.0之後被視為System Exception,但是撰寫程式時,不可以自己丟出RemoteException。

當容器遇到System Exception,容器會記錄錯誤,若認定Bean無法繼續服務,則執行回收資源程序而後加以清除,並藉由丟出EJBException(RuntimeException 子類)、NoSuchEJBException等例外丟出通知呼叫者。
  • Application Exception
除了 RemoteException之外的Checked Exception,都是Application Exception,也就是那些定義在EJB元件介面上throws的例外。

以下是幾個Java EE中有定義的Application Exception:
    • javax.ejb.CreateException
    • javax.ejb.RemoveException
    • javax.ejb.FinderException
    • javax.ejb.DuplicateKeyException
    • javax.ejb.ObjectNotFoundException

Application Exception也可以是RuntimeException的子類別,不過要以@ApplicationException標註,例如:

@ApplicationException(rollback=true)
public class SomeException extends RuntimeException {}

如果EJB元件丟出Application Exception,容器會原封不動的將例外丟回給呼叫者,例如若發生SQLException,這類錯誤通常是由於底層,開發人員無法獨力回復的錯誤 (像是資料庫關閉、無法連線等),這類錯誤直接丟給呼叫者,讓呼叫者知曉這件事並作適當處理(像是顯示錯誤訊息給使用者看)。

在交易環境中,發生Application Exception不會自動將交易撤回,除非您明確使用setRollbackOnly()設定為true,或是在標註 @ApplicationException時設定rollback=true,則發生例外時會先撤回交易,再將例外傳給客戶端。