2009-07-02 123 views
5

我不確定HandleError的不同方式之間有什麼區別。我需要關於HandleError的更多信息

在asp.net的MVC(默認的項目),他們把這個類

[的HandleError]

所以我閱讀一些博客和人身頂說,這

」。 ......告訴框架,如果在控制器中發生未處理的異常,而不是顯示默認的黃色死亡屏幕,它應該提供一個名爲Error的視圖。「

http://blog.dantup.me.uk/2009/04/aspnet-mvc-handleerror-attribute-custom.html

這是否意味着我不應該捕獲任何錯誤(即沒有嘗試捕獲)?

然後我一直在尋找一本書,他們有

[HandleError(ExceptionType=typeof(InsufficientMemoryException),View="About")] 
public ActionResult HandleError() 
{ 
    throw new 
InsufficientMemoryException(); 
    return View("Home"); 
} 

所以他們只是把它放在這個ActionResult的頂部,並給它一個異常類型。我的第一個問題是如果你有多個錯誤,你會拋出什麼?我還以爲你應該處理所有的錯誤。我知道這只是一個小例子,但是如果你不在某處捕獲MemoryException,或者如果你這樣搞砸了「HandleError」?

我也注意到,當在VS中看着HandleError有2個重載方法。其中之一是上面的,另一個是HandError()。

那麼,爲什麼在asp.net MVC示例文件只是[HandleError]而不是[HandleError()]?一個用於行動方法,一個用於班級嗎?我假設HandleError在類的頂部會像HandleError(typeof(Exception))?

最後還有一個叫做IExceptionFilter的東西。所以如果你想記錄所有的異常,或者你有一些特殊的例外,你想用不同的方式做什麼,你是用這個嗎?

就好像我只是想記錄所有的異常,不管我會做出其中的一個,那就是它,但如果我想在NullReferenceexception上做一些特殊的事情,我會做出另一個?

我在看本教程http://dimecasts.net/Casts/CastDetails/37,我沒有看到他們正在談論的這個「ActionFilterAttribute」。這是來自舊版本還是什麼?

顯然它有4種方法可以使用,你必須重寫它們。在我的書,它只是關於這些會談:

  1. 個IAuthorizationFilter
  2. IActionFilter
  3. IResultFilter
  4. 個IExceptionFilter

,他們是如此沒有壓倒一切的所有接口。他們雖然有4種方法。只有一個或2.

謝謝

哦,還有一件事。你應該總是測試每一個異常嗎?就像我的一種方法可能會遇到7種不同的例外。我應該測試所有7個例外(即扔它們),然後最終抓住它們並處理它們(我通常只是打印一些信息)。

如果是這樣,VS2008會找到可以發生異常的東西。我發現很難說有時會拋出異常,然後我必須追查哪些異常。

回答

2

「從不」陷阱System.Exception。你可能會隱藏一個問題。更好地「快速失敗」。

只有陷阱例外:

  • 你知道可能會出現和
  • ,你可以優雅地從恢復和
  • ,你不能先發制人檢查

所以爲了回答你最後一組問題,如果你可以檢查代碼中的條件,我不會捕獲這些異常。例如,如果FileNotFound是其中的一個,而不是捕獲FileNotFoundException,請檢查該文件。如果NullReference是一個,檢查對象是否爲空而不是捕獲異常。

安德魯建議使用ELMAH記錄未處理的異常或任何異常,這是一個很好的例子。

2

要注意的第一件大事是,您應該始終捕獲您可能發生的錯誤。接下來,你不應該試圖捕捉人類已知的每一個錯誤......你可能整天都在你的代碼中添加這樣的東西。 [HandleError]屬性本質上是一個全局錯誤處理程序,它說明如果在此控制器中發生任何錯誤,將它們發送到配置的頁面。這很好,你可以很好地處理所有的錯誤!接下來就是以某種方式處理特定的錯誤。你可以說,如果發生XYZ錯誤,轉到此頁面而不是全局處理的錯誤頁面。如果發生多個錯誤......第一個勝出。這意味着如果你打算捕捉兩種類型的錯誤......首先出現的錯誤將控制你重定向的頁面。

您可能會考慮的任何asp.net網站(webforms或mvc)的下一件事是ELMAH框架。它會記錄並捕獲您網站導致的每一個錯誤。這將幫助你解決任何你不知道的錯誤......這樣你就不必事先計劃它們。這個框架的好處在於,當發生錯誤時,您可以讓它發送一封電子郵件,並將其記錄到xml文件(以及其他配置可能性)中。非常便利!

希望我解決了您的所有疑問!

+1

嗯所以處理錯誤是如果你想要一個通用頁面的所有錯誤? 如果你想要更具體的錯誤,那麼你把它放在actionView? 「IExceptionFilter」如何使用這個?這會成爲我的日誌記錄(或Elmah代碼)的地方嗎? 另外我還不確定代碼的外觀如何?我不處理錯誤(try/catch)還是我仍然處理它們?我不清楚如果我會處理它們,如果混淆[HandleError]。 另外,如果我處理它們不會阻止ELMAH框架做處理異常的東西嗎?即我需要手動記錄已知的? – chobo2 2009-07-03 04:15:15