2010-09-14 92 views
6

我有一個重寫OnException(ExceptionContext filterContext)在我的基本控制器捕捉應用程序在任何錯誤,然後記錄它們。我在我的應用程序中遇到的問題是這種特定的方法針對某些錯誤被關閉了四次。我將向您介紹一個場景:正確的錯誤處理在ASP.NET MVC2

比方說,我瀏覽到: http://localhost:180/someController/someAction?someId=XX

而且我有窮對象在我的代碼處理。傳入的Id是無效的,並且它檢索到一些空對象,然後我的bc處理了不良對象,嘗試對空對象進行操作。我得到一個異常。

BaseController的OnException在這裏被觸發。

null對象仍然返回到視圖,視圖試圖將其綁定到某個對象,或者你有什麼。

對於視圖中的錯誤,BaseController的OnException在此處再次觸發。

本質上,只有一個錯誤對我很重要,但涓滴效應導致更多錯誤發生,並將我的收件箱垃圾郵件: - /。

什麼是正確的方法來捕捉MVC2中的錯誤,而不是發生在我身上?

回答

0

首先解釋爲什麼你會得到多個錯誤。第一個錯誤將來自嘗試對模型或控制器中最有可能的空對象進行操作。當視圖試圖綁定到一個空對象,當它期待一個對象存在時,你可能會得到第二個異常。不完全確定爲什麼你會得到4個錯誤,但可能是因爲代碼試圖對當前爲空的對象進行操作。

我的第一個建議是讓你的OnException代碼將應用程序重定向到友好的錯誤頁面。你可能只是吃掉每個新的異常,並且如果你有這個設置來顯示一個錯誤頁面,不要讓web.config正確處理錯誤頁面。

我的第二個建議是在操作它們之前添加一些代碼來檢查空對象。這些通常被稱爲Guard Clauses,對實施非常有幫助和有用。然後,您可以確定一種友好的方式來處理錯誤,而不必總是在不需要的情況下記錄異常,並且除了通用的「An Error has occured」之外還向用戶顯示友好的消息。信息。

例如,在你的控制器,你可以檢查空對象,該對象是否爲空

Function Example As ActionResult 

    dim obj as Object = GetObject 

    If obj is Nothing Then 

     Return View("FriendlyNoObjectView") 

    Else 

     Return View(obj) 

    End If 

End Function 

我知道這是VB通過不同的觀點給用戶(抱歉,我知道更好,然後C#)但這個想法是一樣的。如果你想要的話,你仍然可以將它記錄爲一個錯誤,但是你會避免錯誤發生很多次。處理髮生的錯誤總是一個很好的做法,儘量不要讓它一直浮到棧頂並導致多個其他錯誤。

希望這可以幫助這些只是從閱讀您的問題的快速思考。

+0

感謝您的快速回復。我會在這裏澄清一些事情。我確實有對空對象的保護,只是想給出一個例外發生的最簡單的方法。此外,錯誤頁面也應該顯示,這也不是問題。只是簡單地說,當一個異常發生,並且涓涓細流引起進一步的異常時,它們都會被記錄下來,而我只關心第一個異常。我會假設第一個錯誤,應用程序會停止執行,但似乎並非如此.. – 2010-09-14 18:53:24

1

我建議你從HandleError屬性繼承,並在那裏滾動你的異常處理。在單個控制器上覆蓋OnException意味着您要麼在很多控制器中有很多異常處理代碼,要麼從基本控制代碼繼承,這是由於MVC流水線在這兩種情況下都不是必需的。

通過使用該屬性,每個操作執行時應該有一個錯誤發生,並且一旦錯誤被處理,它將不會再次觸發。希望這會減少重複的異常消息。

我個人使用屬性進行異常處理,因爲它更乾淨,更可重用,並在我的操作中消除了很多噪音。

+0

這是好的,我喜歡這種方法,但是,我仍然遇到同樣的問題仍然試圖完成請求執行,冒泡到部分視圖和視圖,在每個視圖上創建錯誤。這是我觀察到的異常(第一個異常,我想記錄的異常,發生在控制器中): 執行處理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'的子請求時出錯。 – 2010-09-15 16:12:21