2011-03-04 54 views
5

在我的ASP.NET MVC應用程序中,我不想向用戶報告所有異常消息。但是我想向用戶報告某些類型的異常,所以我創建了一個動作過濾器來決定它是否是這種特定類型的異常,如果是,則顯示異常的消息,否則顯示通用消息。所以我創建了一個名爲ClientException的自定義異常。向用戶報告異常消息時的最佳實踐

我的過濾器看起來是這樣的:

if (filterContext.Exception is ClientException) 
     message = filterContext.Exception.Message.Replace("\r", " ").Replace("\n", " "); 
    else 
     message = "An error occured while attemting to perform the last action. Sorry for the inconvenience."; 

    filterContext.HttpContext.Response.Status = "500 " + message; 

我讀這http://blogs.msdn.com/b/kcwalina/archive/2007/01/30/exceptionhierarchies.aspx在這裏筆者建議使用現有的.NET異常類型報告使用錯誤。但是,通過引入我的自定義例外,我只需在我的過濾器中執行一次檢查。我的方法好嗎?

回答

3

我喜歡這種方法有幾個原因。

首先,它安全地失敗。如果某人不明確地拋出一個ClientException,那麼異常詳細信息不會被報告。忘記展示一些東西比意外展示一些東西要小。

其次,它允許決定是否在適當的地方顯示異常。例如,並不是所有的IOException都被顯示出來。有些可能是,有些則不然。特定的異常可以在調用堆棧中的任何位置捕獲和轉換,以便可以在已知正確的地方進行轉換。

的那些東西都共同表示,未來開發商將不會改變innappropriately要顯示一整類的異常,或者覺得這事不會被顯示時,它實際上會。

此外,使用特定的異常類型的目的是後來決定採取應對該異常的操作。 「向用戶顯示此消息」是一個很好的指定操作。一旦做出這個決定,那麼例外的確切性質就完全不相關。 (原來的問題可能被放置在InnerException屬性,用於日誌記錄,當然)。

所以,在我看來,這是一個不錯的設計。

1

如果你的方法適合你,那麼它很好。您是否驚訝Microsoft博客建議您使用他們的Exception類? ;)

有一些.NET庫功能和第三方OSS的東西,只會然而與.NET異常工作。

要獲得兩全其美的你總是可以在.NET Exception對象延伸到你自己的。

1

我將使用基於異常的類型,不同的閾值,並且這些閾值將與異常消息有關。

基於特定的閾值邏輯,您可能想要決定是否顯示異常。

2

你的方法是好的國際海事組織,但有替代品。 (我們是軟件開發人員,所以總是有其他選擇。)

您可以利用Exception Data字典來存儲指示異常是否爲客戶端異常的標誌。然後你可以讓你的過濾器檢查標誌的存在。

1

我對此解決方案的擔憂是很可能這些異常通常會被業務層中的對象(或MVC術語中的模型對象)拋出。你描述的用法實際上是我認爲是介紹問題的東西。

通常情況下,您需要重新拋出您的模型中包含的任何異常,只會傳達是否可以將該異常暴露給用戶。 您希望用戶如何處理這些信息?如果用戶能夠解決這種情況,那麼可能不應該有一個例外來指示狀態開始?

我會堅持抓住每個案例的特定例外,並在現場做演示決定。你可以發出一個異常,如同被捕獲的那樣,雖然用作模型。我仍然會讓控制器決定,而不是任何拋出異常的人。

+0

感謝您的有用信息。 – Prabhu 2011-03-05 00:37:48