2009-09-09 62 views
1

我有一些EJB使用Hibernate將數據保存到數據庫。我有一個與這些EJB進行對話的Swing客戶端。客戶端對數據庫一無所知(沒有驅動程序jar)。正確的EJB異常處理 - 來自客戶端的ClassNotFoundException

在一次事務中,可能會拋出Hibernate ConstraintViolationException。我捕獲所有異常和將它們包裝在一個EJBException異常,像這樣:

catch(HibernateException e) { 
    e.printStackTrace(); 
    throw new EJBException(e); 
} 

我得到的問題是,當異常是由JBoss的調用程序在客戶端解組,一個ClassNotFoundException是因爲拋出(用於PSQLException)客戶端在類路徑中沒有sql驅動程序jar。

我改變了這個應用程序總是將捕獲到的異常傳遞給ejbexception這樣的構造函數,所以我們可以有一個堆棧跟蹤歷史記錄。現在我正在尋找爲什麼最初的開發者沒有這樣做。

在這一點上,我看到兩個選項 - 包括postgres驅動程序jar與客戶端,或者移除將捕獲的異常傳遞給EJBException構造函數。我很好奇,如果任何人有任何其他的建議,以及其他人如何處理EJB中的異常?

回答

2

我認爲客戶端,最終用戶不需要知道問題的技術細節。因此,在各個層邊界,將技術例外轉換爲一般性的「自然XYZ出現的錯誤」是非常合理的。

我見過的一個方案是服務器在檢測到異常的時候分配一個唯一的錯誤號。然後它將診斷寫入其日誌中,包括該號碼。向客戶報告的消息只包含該號碼。然後,支持臺可以通過該特定錯誤編號來關聯用戶的問題報告。

+0

+1爲「客戶不需要知道技術細節」。不過,我認爲獨特的錯誤號碼方法是完全不必要的。所有客戶需要知道的是「發生服務器錯誤」。服務器日誌應該提供所有必要的信息來解決問題。 – ChssPly76 2009-09-09 18:10:26

+0

當你有很多用戶,並且他們在錯誤報告中並不總是及時或準確的,並且你有一個非平凡的n層體系結構,我相信這些錯誤號碼確實有用,而且遠非必要。實施的工作量是微不足道的。 – djna 2009-09-09 18:14:56

+0

我的不好。我的意思不是「無謂的」,而是「無意義的」:-)我們已經嘗試過這種方法,發現實際的錯誤數量在大約0.5%的情況下回到我們身上;其他人被報告爲「某種錯誤」或「窗口彈出」。但也許你的用戶比我的好 - 我只能羨慕你然後:-) – ChssPly76 2009-09-09 18:20:24