EJB是通常基於分散式環境中的企業應用程式的一部分。因此,除了正常的例外中可能出現的程式碼,EJB的情況下,可以有例外,如通訊故障,安全許可權,伺服器關閉等。EJB容器在兩個方面考慮異常。
Application Exception - 如果違反業務規則或執行業務邏輯時發生了異常。
System Exception- 沒有任何異常所造成的業務邏輯或業務程式碼。 RuntimeException的RemoteException的SystemException。例如,在EJB查詢錯誤。
當應用程式發生異常,EJB容器攔截異常,但返回到用戶端。它不會回滾事務,除非它是在程式碼中指定EJBContext.setRollBackOnly()方法。 EJB容器不會迴繞應用程式異常情況下的異常。
當系統發生異常,EJB容器攔截異常,回滾事務,並開始清理任務。它包裝到RemoteException和異常丟擲給用戶端。
對談EJB的方法 - 因為這些方法負責執行業務邏輯應用程式異常被丟擲。應用程式異常應在業務方法throws子句中宣告,並應扔在失敗情況下的業務邏輯。
@Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { ... public List<Book> getBooks() throws NoBookAvailableException { List<Book> books = entityManager.createQuery("From Books").getResultList(); if(books.size == 0) throw NoBookAvailableException ("No Book available in library."); return books; } ... }
系統異常可以發生在任何時間像命名查詢失敗,發生SQL錯誤而獲取資料。在這種情況下,這樣的異常必須在EJBException的包裹下,丟擲返回給用戶端。
@Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { ... // by tw511.com public List<Book> getBooks() { try { List<Book> books = entityManager.createQuery("From Books").getResultList(); } catch (CreateException ce){ throw (EJBException) new EJBException(ce).initCause(ce); } catch (SqlException se){ throw (EJBException) new EJBException(se).initCause(se); } return books; } ... }
在用戶端,處理EJBException。
public class EJBTester { private void testEntityEjb(){ ... try{ LibraryPersistentBeanRemote libraryBean = LibraryPersistentBeanRemote)ctx.lookup("LibraryPersistentBean/remote"); List<Book> booksList = libraryBean.getBooks(); } catch(EJBException e) { Exception ne = (Exception) e.getCause(); if(ne.getClass().getName().equals("SqlException")){ System.out.println("Database error: "+ e.getMessage()); } } ... } }