
- EJB 教程
- EJB - 首頁
- EJB - 概述
- EJB - 環境設定
- EJB - 建立應用程式
- EJB - 無狀態Bean
- EJB - 有狀態Bean
- EJB - 永續性
- EJB - 訊息驅動Bean
- EJB - 註解
- EJB - 回撥
- EJB - 定時器服務
- EJB - 依賴注入
- EJB - 攔截器
- EJB - 可嵌入物件
- EJB - Blob/Clob
- EJB - 事務
- EJB - 安全性
- EJB - JNDI繫結
- EJB - 實體關係
- EJB - 訪問資料庫
- EJB - 查詢語言
- EJB - 異常處理
- EJB - Web服務
- EJB - 打包應用程式
- EJB 有用資源
- EJB - 快速指南
- EJB - 有用資源
- EJB - 討論
EJB - 異常處理
EJB是企業應用程式的一部分,這些應用程式通常基於分散式環境。因此,除了可能發生的普通異常之外,還可能出現諸如通訊故障、安全許可權、伺服器宕機等異常。
EJB容器以兩種方式考慮異常:
應用程式異常 - 如果違反業務規則或在執行業務邏輯時發生異常。
系統異常 - 任何不是由業務邏輯或業務程式碼引起的異常。RuntimeException、RemoteException屬於系統異常。例如,EJB查詢期間出錯。RuntimeException、RemoteException屬於系統異常。
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 { ... 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()); } } ... } }
廣告