2012-11-08 21 views
6

我是一個綠色開發人員,試圖在大型多層java應用程序中處理錯誤處理(har-har)。在很多情況下,我認爲通過多個層次鏈接異常是一個好主意;例如當在呼喚最下層的一些外部服務中的故障導致的問題一路上揚的觀點:何時記錄鏈接異常?

  • 內容X要求,但用戶無權
    • 原因包括:授權名單用戶是空
      • 造成的:用戶管理web服務響應壞請求 - 參數foo的格式必須爲像「XYZ」

最重要的例外情況,我真正想要檢查的堆棧跟蹤是最後一個例子,我提出了一個不好的要求,我需要修正foo的格式。但是,當我讓這個異常通過圖層向上冒泡時,很好地鏈接在對每個圖層都有意義的異常中......當我最終捕獲並記錄這些東西時,默認日誌記錄行爲總是向我顯示關於最外層異常的詳細信息,也許有5行堆棧跟蹤的根本原因。

這讓我想記錄發生的異常,讓它們冒泡,但是最終你記錄了大部分東西;何時發生以及何時最終被發現。

這裏的最佳做法是什麼?

+0

關於這個問題會有很多意見,但是沒有「真相」,選擇適合你的東西,不管你選擇什麼,人們都會不同意(我個人喜歡把東西重新推到最外層並記錄在那裏) – Friso

回答

1

偉大的問題,我很好奇你會得到其他答案。

我傾向於採取「更多更好」的方法,並記錄每一步的方式。這是否會產生大量日誌?是的,但是當您在大型Java應用程序中調試問題時,您會感謝您擁有的每條日誌行。還有一些工具(至少是grep,awksed三重奏)來幫助您篩選大文件。

另一種技術是編寫這個日誌代碼,但把它關掉(如果你使用類似log4j的東西,到TRACE級別)。這樣,如果遇到問題,您可能沒有可用的日誌,但它只是一條線路更改(以降低日誌記錄閾值)並開始生成大量用於調試的數據。與以前的技術一起,大多數日誌庫(我再次回到我對log4j的瞭解)可以讓你調整不同java包的日誌級別。這意味着您可以將所有這些「捕獲和重新拋出」日誌行編寫爲跟蹤,並將較低級別軟件包上的日誌記錄更改爲WARN,同時將上一級軟件包保留爲DEBUGTRACE

2

我會推薦一種不同的異常管理方法。在應用程序的最頂層(如請求入口點)創建一個try catch塊來調用任何運行時異常。這是最好你有2個catch塊: - 爲您的特殊應用(業務)例外 - 爲休息(例外)

正如你可以看到youl'l需要引入你自己的異常類型將擴展爲不同目的創建不同的例外情況。例如,您可以爲應用程序的每個層創建一個自定義異常,用於每個集成等。使用未經檢查的豁免,因爲它們都將在頂層處理。如果發生任何異常情況(捕獲低級異常),您應該: - 放入與業務環境相關的描述(例如「未能從DB加載帳戶數據」 - 添加對原始異常的描述(例如「原始錯誤:與數據庫的連接失敗「) - 將異常傳遞給您的異常以避免丟失跟蹤 - 拋出並忘記換句話說,頂層catch塊負責處理它適當地(回退事務,顯示錯誤消息或其他任何你可能需要的東西

+0

似乎是一個很好的方法;當我將自定義異常一直吹到頂層時,我有一個地方可以將他們的根本原因傳遞給記錄器。 但是,如果有一個地方我需要捕捉並記錄其中一個地方,我將記錄包裝的異常。將包裝器異常的堆棧跟蹤截斷爲僅一行還是不行,是否有任何問題?我不明白爲什麼會導致問題,但修改堆棧跟蹤聽起來不太合適。 – PotataChipz