2017-02-17 42 views
0

我正在處理我的DAO,無法弄清楚處理異常的最佳方法。使用.persist()時,可以發出3個異常:EntityExistsException/IllegalArgumentException/TransactionRequiredException。JavaEE EntityManager異常處理

我只是想知道什麼是最好的方法來捕捉和拋出異常(我想處理它在更高的水平)。

我應該捕捉並拋出一個簡單的異常,還是更有效地分別捕獲上述異常?

第一種方法,我只是捕捉異常,並把它:

public void addAccount(final Account accountToAdd) throws AccountJpaException { 

    try { 
     em.persist(accountToAdd); 
    } catch (Exception e) { 
     throw new AccountJpaException(e); 
    } 

    } 
} 

方法二:我趕上他們中的每一個單獨

public void addAccount(final Account accountToAdd) throws AccountJpaException, AccountExistsException { 

    try { 
     em.persist(accountToAdd); 
    } catch (EntityExistsException e) { 
     throw new AccountExistsException(e); 
    }catch(IllegalArgumentException e){ 
     throw new AccountJpaException(e); 
    }catch(TransactionRequiredException e){ 
     throw new AccountJpaException(e); 
    } 

    } 
} 

謝謝您的建議!

+2

你不應該真的抓住他們中的任何一個。尤其不是'IllegalArgumentException'或'TransactionRequiredException'。 – Kayaman

+0

這是爲什麼?未處理的異常可能會造成一些混亂,或者我在這一點上完全錯誤? – raik

+2

因爲,正如你的問題所說,你應該*在更高的層面上處理它們*。 –

回答

0

大多數N層應用程序指定服務類的一些事務邊界。在那裏捕獲這些類型的異常並在此處引用特定於用例的異常而不是將此邏輯處理推送到DAO會更合適。

現在考慮一下DAO方法被兩個不同的服務類實現使用。可以想象的是,它們解決了您的業務領域中的不同擔憂,因此應拋棄的例外情況應該更具針對性。

如果我們採取第二種方法,您將捕獲這些異常並從DAO中拋出一些超級通用異常,以僅捕獲這些異常並在服務級別重新拋出更細粒度的異常,這是過度的。

我的經驗法則是在服務/域級別捕獲這些類型的案例,從那裏傳播特定於域的異常,並根據需要在控制器中處理這些異常,可能是通過某些顯示相應網頁的特定錯誤處理程序基於異常類型的視圖等。