国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

EJB 異常處理的最佳做法(2)

2019-11-18 14:44:37
字體:
來源:轉載
供稿:網(wǎng)友

  EJB 異常處理的最佳做法(2)

實體 EJB 組件中的應用程序異常
清單 2 顯示了實體 EJB 的一個 ejbCreate() 方法。這個方法的調(diào)用者傳入一個 OrderItemValue 并請求創(chuàng)建一個 OrderItem 實體。因為 OrderItemValue 沒有名稱,所以拋出了 CreateException。

清單 2. 實體 EJB 組件中的樣本 ejbCreate() 方法
public Integer ejbCreate(OrderItemValue value) throws CreateException {
if (value.getItemName() == null) {
throw new CreateException("Cannot create Order without a name");
}
..
..
return null;
}

清單 2 顯示了 CreateException 的一個很典型的用法。類似地,假如方法的輸入?yún)?shù)的值不正確,則查找程序方法將拋出 FinderException。

然而,假如您在使用容器治理的持久性(CMP),則開發(fā)者無法控制查找程序方法,從而 FinderException 永遠不會被 CMP 實現(xiàn)拋出。盡管如此,在 Home 接口的查找程序方法的 throws 子句中聲明 FinderException 還是要更好一些。RemoveException 是另一個應用程序異常,它在實體被刪除時被拋出。

從實體 EJB 組件拋出的應用程序異常基本上限定為這三種類型(CreateException、FinderException 和 RemoveException)及它們的子類。多數(shù)應用程序異常都來源于會話 EJB 組件,因為那里是作出智能決策的地方。實體 EJB 組件一般是啞類,它們的唯一職責就是創(chuàng)建和取回數(shù)據(jù)。

會話 EJB 組件中的應用程序異常
清單 3 顯示了來自會話 EJB 組件的一個方法。這個方法的調(diào)用者設法訂購 n 件某特定類型的某商品。sessionEJB() 方法計算出倉庫中的數(shù)量不夠,于是拋出 NotEnoughStockException。NotEnoughStockException 適用于特定于業(yè)務的場合;當拋出了這個異常時,調(diào)用者會得到采用另一個備用途徑的建議,讓他訂購更少數(shù)量的商品。

清單 3. 會話 EJB 組件中的樣本容器回調(diào)方法
public ItemValueObject[] placeOrder(int n, ItemType itemType) throws
NotEnoughStockException {

//Check Inventory.
Collection orders = ItemHome.findByItemType(itemType);
if (orders.size() < n) {
throw NotEnoughStockException("Insufficient stock for " + itemType);
}
}

處理系統(tǒng)異常
系統(tǒng)異常處理是比應用程序異常處理更為復雜的論題。由于會話 EJB 組件和實體 EJB 組件處理系統(tǒng)異常的方式相似,所以,對于本部分的所有示例,我們都將著重于實體 EJB 組件,不過請記住,其中的大部分示例也適用于處理會話 EJB 組件。

當引用其它 EJB 遠程接口時,實體 EJB 組件會碰到 RemoteException,而查找其它 EJB 組件時,則會碰到 NamingException,假如使用 bean 治理的持久性(BMP),則會碰到 SQLException。與這些類似的受查系統(tǒng)異常應該被捕捉并作為 EJBException 或它的一個子類拋出。原始的異常應被包裝起來。清單 4 顯示了一種處理系統(tǒng)異常的辦法,這種辦法與處理系統(tǒng)異常的 EJB 容器的行為一致。通過包裝原始的異常并在實體 EJB 組件中將它重新拋出,您就確保了能夠在想記錄它的時候訪問該異常。

清單 4. 處理系統(tǒng)異常的一種常見方式
try {
OrderHome orderHome = EJBHomeFactory.getInstance().getOrderHome();
Order order = orderHome.findByPRimaryKey(Integer id);
} catch (NamingException ne) {
throw new EJBException(ne);
} catch (SQLException se) {
throw new EJBException(se);
} catch (RemoteException re) {
throw new EJBException(re);
}

避免重復記錄
通常,異常記錄發(fā)生在會話 EJB 組件中。但假如直接從 EJB 層外部訪問實體 EJB 組件,又會怎么樣呢?要是這樣,您就不得不在實體 EJB 組件中記錄異常并拋出它。這里的問題是,調(diào)用者沒辦法知道異常是否已經(jīng)被記錄,因而很可能再次記錄它,從而導致重復記錄。更重要的是,調(diào)用者沒辦法訪問初始記錄時所生成的唯一的標識。任何沒有交叉引用機制的記錄都是毫無用處的。

請考慮這種最糟糕的情形:單機 java 應用程序訪問了實體 EJB 組件中的一個方法 foo()。在一個名為 bar() 的會話 EJB 方法中也訪問了同一個方法。一個 Web 層客戶機調(diào)用會話 EJB 組件的方法 bar() 并也記錄了該異常。假如當從 Web 層調(diào)用會話 EJB 方法 bar() 時在實體 EJB 方法 foo() 中發(fā)生了一個異常,則該異常將被記錄到三個地方:先是在實體 EJB 組件,然后是在會話 EJB 組件,最后是在 Web 層。而且,沒有一個堆棧跟蹤可以被交叉引用!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 竹北市| 泰和县| 蒙阴县| 科技| 达孜县| 迁安市| 钟山县| 库车县| 庄浪县| 阳泉市| 龙州县| 南木林县| 乌拉特后旗| 宁化县| 连州市| 县级市| 临夏县| 绥宁县| 齐齐哈尔市| 肥东县| 上杭县| 泸定县| 龙口市| 陇川县| 连州市| 汕头市| 肃南| 临湘市| 广安市| 澎湖县| 英吉沙县| 策勒县| 房产| 临城县| 竹北市| 卢湾区| 神农架林区| 利川市| 晋宁县| 固阳县| 青岛市|