2013-01-18 104 views
8

從EJB規範引述:EJB 3.0例外處理

如果bean方法遇到系統異常或錯誤,應該 簡單地從bean方法的錯誤傳播到容器 (即bean方法不必捕獲異常)。

但我不明白。這是否意味着我不應該捕捉所有類型的異常(即嘗試捕捉Exception類)並將它重新拋出爲我的應用程序異常?

爲了更清楚的例子:

public void beanMethod throws MyApplicationException { 
    try { 
    // do something 
    } catch (Exception e) { 
    throw new MyApplicationException(e); // Should I do it like this? 
    } 
} 

或者這不是EJB開發,但僅用於EJB引用的實現開發者(容器開發者):在後一種情況下,作爲結果,容器必須不會將系統異常傳播到我的業務方法,並且我的catch(Exception e)塊永遠不會捕獲任何系統異常?

回答

10

還有更多類型的例外:

  • 系統異常(RuntimeExceptions如NullPointerException異常)
  • 業務異常(自己的異常,擴展異常,但不是RuntimeException的,如NotEnoughMoneyOnYourAccountException。)
  • 錯誤(例如OutOfMemoryError)

通常情況下,您應該捕獲業務異常。但是,如果你想在那裏處理,你當然可以把它扔給客戶端。默認情況下,如果你把一個BusinessException EJB容器不會回滾您的交易,但你可以通過註解你的異常以下方式更改此行爲:

@ApplicationException(rollback = true) 
public class NotEnoughMoneyOnYourAccountException extends Exception { 

如果你的程序拋出RuntimeException,它將被送往客戶端被封裝爲RemoteException,並且您的事務將被回滾。這些不如業務異常例外,因此我們通常不會在EJB方面捕捉它們。

錯誤是最少的例外,它們甚至可以關閉JVM,通常我們不會捕獲它們,因爲通常我們無法在程序中處理它們。

+0

I.e.你建議我在ejb方法中根本沒有try-catch塊? – MyTitle

+0

是的。這是很少需要的。 –

+0

也許如果你想包裝一個非RuntimeException給你自己的。例如,SQLException - > MyBusinessException。 –

0

我不知道你從哪裏得到這個提示,以及上下文是什麼,但它似乎意味着bean方法本身不應該做任何異常處理,只是拋出它所得到的任何東西。這種行爲通常通過添加方法主體可能拋出的異常來實現,取決於環境/隨機因素,例如throws clausule中的變量輸入,其中MyApplicationException現在是。

由方法中的代碼錯誤(不是在方法調用中)直接導致的異常通常不需要正確處理,因爲它們應該通過測試和調試取出。