2017-06-22 48 views
2

我正在捕獲DAO類中的泛型異常並將其包裝爲DaoException。這樣做的主要原因是,EBean在保存失敗的情況下拋出不同的運行時異常,我不想將它們傳播到上層。上層應該只知道保存是否成功。在DAO層捕獲泛型異常是一種不好的做法嗎?

以下是代碼片段。

public void save(Object object) throws DaoException { 
     try { 
      Ebean.save(object); 
     } catch (Exception e) { 
      throw new DaoException("Error saving record", e); 
     } 
    } 

這違背了一般的概念,即泛型異常不應該被捕獲。

但是,在這種情況下這是可以接受的,或者仍然是一個不好的做法?

還有幾件事要添加到我的問題。 我確切的要求是

  1. 有設置,我需要在交易與堅持獨立的對象。 (需要這樣做的交易,以避免在同一時間其他情況下進行更改到同一對象)

  2. 如果一個對象未​​能persits由於一些錯誤,還是其他物體需要堅持。 (Cz他們是獨立的)

我在做的服務層是循環的對象集。如果我從一個對象中收到一個DaoException,我將它添加到錯誤響應中並繼續循環。但它不應該打破交易。 有沒有更好的方法來滿足這個要求?

+0

爲什麼save函數會拋出不同的類型? –

+0

可能重複的https://stackoverflow.com/questions/21938/is-it-really-that-bad-to-catch-a-general-exception?rq=1 – scottb

回答

1

在異常處理中,遵循的拇指規則是:早期捕獲,稍後處理。

在Dao層,如果你想在發生任何特定類型的Excepion時採取任何行動,那麼你必須捕獲特定的異常而不是泛型的Exception類。

E.g:當使用彈簧JDBC,我們可以捕獲各種各樣類型的exceptions ,並相應地,我們可以採取的動作,例如執行數據庫操作的重試或等待一段時間才能獲得的任何鎖。然而,如果你在異常情況下不需要在Dao層中進行任何處理,那麼你最好在外部類中處理這個異常。

相關問題