2009-11-18 263 views
0

我在我的web應用程序中有一些代碼來處理未處理的異常 - 它交給了一個花哨的自定義錯誤頁面,它記錄了詳細信息。但是如果在自定義錯誤頁面中有未處理的異常怎麼辦?如何處理異常處理代碼中的異常?

我可以通過檢查Request.CurrentExecutionFilePath是否等於我的自定義錯誤頁面,在我的一般異常處理程序中檢測到這種情況,從而採取措施避免該循環。但任何想法這些步驟應該是 - 回到死亡的黃色屏幕,交給一個靜態的自定義錯誤頁面?

或者我應該只是將自定義錯誤頁面代碼包裝在try {...} catch {}中,不要再擔心了嗎?

+0

任何異常日誌代碼本身應該放在 嘗試{} 趕上 (異常前) {// 無能爲力這裏 } 空catch塊。 某些時候,「瘋狂的事情」可能發生在異常日誌記錄代碼中。 – PRR 2009-11-18 12:23:36

回答

0

將您的自定義錯誤代碼頁封裝在try {...} catch {doSomethingThatCannotPossiblyFail()}構造中。

+0

假設有人稍後出現並忽略文件中的所有註釋,並添加一些代碼,可以在catch {...}塊或try {...} catch {...}之外引發異常。也許我太過分了,不想爲這種可能性辯護... – noj 2009-11-18 12:24:50

+0

這種方法的問題是,如果例外已經到了這麼遠(即500頁),那麼唯一的想法可能是可能的,就是在這個階段吞下例外,這從來都不是一個好主意。它只是登錄遠征隊而不是通過自定義的500頁告知用戶失敗 – Sheff 2009-11-18 13:02:04

+0

jdt199:這就是爲什麼我的答案catch塊不是空的;-)完全吞嚥是一個壞主意,同意。 – 2009-11-18 13:11:14

2

我會使用.nets自定義錯誤框架,並設置一個靜態HTML文件作爲500錯誤的目標。有一個自定義的500頁面做任何可能失敗的主意是不好的,因爲它的任何io命令已經失敗了(比如數據庫或文件訪問)。

它總是最好保留自定義500頁作爲簡單的html文件,並通過應用程序global.asax中的Application_Error事件執行所有異常記錄,允許引發異常,然後使用.net自定義異常處理程序提供您的自定義頁。

編輯:這是上述模式的相關文章。請注意,唯一的區別就是我會用一個靜態的html頁面500

http://devhood.com/tutorials/tutorial_details.aspx?tutorial_id=237

0

老實說這一切取決於你的記錄機制的波動性,以及如何糟糕,你要記錄的錯誤。因爲它基於程序外部的某些工作(例如,數據庫可用,可訪問日誌文件,事件日誌未滿等),因此總會有可能導致日誌記錄失敗。如果沒有其他原因阻止向用戶顯示巨大的惡意錯誤,那麼您應該將您的日誌記錄在try catch塊中。

就我個人而言,我會放入多個日誌記錄路徑。第一個可能是數據庫(儘管我個人不喜歡將錯誤記錄到數據庫,我更喜歡日誌文件),第二個是事件日誌,並嘗試發送一封電子郵件,指出某些錯誤。沒有確定的方法可以說我的日誌記錄到外部源絕對不會失敗,但是您可以最大限度地減少這種可能性,並確保無論最終用戶發生什麼情況,都不會看到災難性故障錯誤。