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等例外丟出通知呼叫者。
基本上繼承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:
以下是幾個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 {}
public class SomeException extends RuntimeException {}
如果EJB元件丟出Application Exception,容器會原封不動的將例外丟回給呼叫者,例如若發生SQLException,這類錯誤通常是由於底層,開發人員無法獨力回復的錯誤 (像是資料庫關閉、無法連線等),這類錯誤直接丟給呼叫者,讓呼叫者知曉這件事並作適當處理(像是顯示錯誤訊息給使用者看)。
在交易環境中,發生Application Exception不會自動將交易撤回,除非您明確使用setRollbackOnly()設定為true,或是在標註 @ApplicationException時設定rollback=true,則發生例外時會先撤回交易,再將例外傳給客戶端。