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