今天在開發過程中遇到一個很奇特的問題,就是 Global 檔案中的Application_Error 方法不執行的問題,很是苦惱,查了有關這方面的問題,感覺網友們回答的都有點亂,有些人說 在編譯時不需要這個檔案,在專案部署的時候再放進去,有些人說Global.asax可能沒被正常載入,session沒有啟用引起Application_Error內部出錯,等等
最開始,我也以為是 Global.asax 檔案沒被載入,所以我在Application_Start 方法中設定斷點,發現 是可以進入的,這就排除了載入失敗的可能性,
後來我在測試過程中意外的發現在webform 頁面的 的Load事件中 編寫一段會丟擲異常的程式碼,例如:(string str = "a" int.parse(str)),然後在Application_Error 中是可以進入的,這就奇怪了,難道Global檔案只在WebForm頁面中才有效?這應該不可能啊,
因為我們得專案用的是html 頁面 後臺使用的是ashx(一般處理程式)裡面, 所以我就在想是不是異常要在 一般處理程式裡面去處理,我們的一般處理程式結構如圖:
我們在接受了請求後,響應之前是使用了try{}catch語句的,也就是捕獲了異常,但是並沒有處理異常,我就試了試加上throw ex;這句話在catch中,果然,問題解決了
解釋一下紅色框部分:原本關注Global 的Application_Error方法就是為了 給系統記錄日誌,紅色框中程式碼就是給資料庫中新增一條捕獲的異常的日誌資訊,這裡這部分可以寫在Global 的Application_Error方法中,同時替換這部分為 throw ex;這句話
和我現在這樣寫的結果都可以滿足我們專案的需求。
其實簡單的結論就是:全域性Global檔案 的Application_Error 是在丟擲異常的情況下才會執行的,也就是說,當出現異常時,你捕獲了,但是不處理就不會進入該方法,反之繼續往上丟擲 最終會進入該方法!