簡體   English   中英

Java EE項目的異常處理體系結構

[英]Exception handling architecture for Java EE projects

我正在嘗試收集有關其他Java EE程序員如何進行異常處理的輸入。 您是否集中了錯誤處理(例如Servlet過濾器)?

您是否為不同的應用程序層(持久性,服務等)創建了不同的異常類型?

你只是吞下了例外而不是把它們扔到鏈子上嗎?

異常處理架構還有哪些其他范例? 你用哪個?為什么?

持久層(如果使用JPA或Hibernate實現)已經有自己的異常,這些異常是運行時異常。

服務層在傳遞非法參數時(當它們應該由表示層驗證時)拋出運行時異常,或者在發生可恢復錯誤時檢查異常(例如:所選名稱已存在於數據庫中)。

表示層的每個控制器處理它調用的業務服務拋出的已檢查異常,以提供有意義的錯誤消息並讓用戶從錯誤中恢復(例如:重新顯示表單並要求用戶選擇其他名稱) )

來自表示層,業務層或持久層的所有其他運行時異常由一個或多個全局異常處理程序(大多數UI框架支持它們)處理,這些異常處理程序記錄異常並拋出或多或少的一般錯誤消息(例如:“發生意外錯誤”,“其他一些用戶修改或刪除了您嘗試修改的對象”)。

例外是純金,因為你試圖找出問題所在。 相應地對待他們!

吞咽異常僅在極少數情況下是可接受的,其實際上是適當的行動。

Java中的已檢查異常通常會強制您考慮如何處理接近實際發生位置的錯誤。 請注意,將異常包裝在DomainException(或其適當的子類)中並將其從調用鏈中發送到可以實際處理它並正常恢復的位置是完全可以接受的。

在大多數情況下,您有一個最頂層的try-catch,它允許您捕獲所有異常並處理它們。 這就是為什么提供盡可能多的邏輯(通過將它包裝在對你有意義的異常中)非常重要的原因,因此這個處理程序可以相應地行動。

對於已知情況,可以采取適當的措施。

對於未知情況,這是一個失敗的問題,因為你的系統處於意外狀態。 盡可能多地記錄 - 因為您可能無法以其他方式重現它 - 並進入合適的狀態(退出,拒絕進一步服務,或者只是根據您的模型繼續進行)。

我強烈反對吞咽異常的做法。 這是浪費大量時間調查問題根源的最佳方法。 當我最終在一個空的catch子句中找到隱藏的異常時,我有很多wtf時刻。 我同意Thorbjørn關於這樣一個事實,即大多數時候你有一個頂級嘗試捕獲。 在其中我發現自己使用了許多可能拋出異常的方法,並且為了避免錯誤處理代碼,我更喜歡在頂部捕獲中捕獲異​​常。
關於集中化 ,我相信你的日志文件應該足夠集中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM