2012-03-09 66 views
3

Global.asax中的Application_Error似乎只能捕獲由MVC運行時生成的錯誤。還有其他涉及覆蓋Controller.OnException的解決方案。ASP.NET MVC中的全局錯誤處理。可能?

是否有可能創建一個錯誤處理程序來捕獲所有控制器(包括由我的代碼生成的錯誤)中的所有錯誤?

+3

Application_Error捕獲所有錯誤。你的代碼生成的控制器是什麼意思?什麼樣的錯誤沒有被捕獲? – 2012-03-09 06:50:53

回答

4

是 - 如果你看看Global.asax中,HandleErrorAttribute添加到GlobalFilterCollection

 filters.Add(new HandleErrorAttribute()); 

但默認HandleErrorAttribute將只處理內部服務器錯誤,這是所有是例外不HttException和HttpExceptions錯誤代碼爲500.您可以從該屬性派生來處理所有異常並進一步自定義默認行爲。

HandleErrorAttribute是asp.net mvc中錯誤處理的標準方式。

+0

你可以舉例說明如何通過派生的HandleErrorAttribute類來處理所有類型的異常? – 2012-09-06 09:20:50

+0

標準方式,但不全面。就我所知,控制器之外拋出的異常沒有這種好處。例如,路由處理中的例外;或者在處理異常時甚至可能是例外。 – Cornelius 2012-10-30 13:20:54

1

就像archil說的那樣,你甚至不需要用[HandleError]裝飾控制器/動作,因爲默認情況下(在MVC3中)。

錯誤將返回Error.cshtml視圖,如果您使用了項目模板,它將位於Views/Shared中。

如果需要,您可以自定義它,模型是HandleErrorInfo,因此如果您想要一個很好的自定義異常消息,您可以將控制器名稱,操作,消息和堆棧跟蹤從那裏拉出。這裏有一個問題:你不能在這個頁面上有任何邏輯/操作。

,你將不得不啓用在Web.config中的自定義錯誤,否則你會得到無論如何標準屏幕偏黃:

<system.web> 
    <customErrors mode="On"/> 
    ... 
</system.web> 

而在的customErrors可以定義一個靜態頁面後備,以防當一切都失敗了。