2011-07-06 90 views
19

我想在我的ASP.NET MVC 3應用程序中處理未捕獲的異常,以便我可以通過應用程序的錯誤視圖向用戶傳達錯誤。如何攔截未捕獲的異常?我希望能夠在全球範圍內做到這一點,而不是爲每個控制器(雖然我不介意也知道如何做到這一點)。如何在ASP.NET MVC 3應用程序中處理未捕獲的異常?

回答

19

您可以設置一個全球性的錯誤過濾器Global.asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
} 

上面設置該將所有的異常標準錯誤查看默認的錯誤處理程序。錯誤視圖被輸入到一個System.Web.Mvc.HandleErrorInfo模型對象,該對象公開了異常詳細信息。

您還需要打開web.config中的自定義錯誤才能在本地計算機上看到此錯誤。

<customErrors mode="On"/> 

您還可以定義多個過濾器的具體錯誤類型:

filters.Add(new HandleErrorAttribute 
{ 
    ExceptionType = typeof(SqlException), 
    View = "DatabaseError", 
    Order = 1 
}); 

/* ...other error type handlers here */ 

filters.Add(new HandleErrorAttribute()); // default handler 

注意HandleErrorAttribute將只處理了MVC管道(即500錯誤)的內部所發生的錯誤。

+0

謝謝你,這工作得很好:) – aknuds1

10

可以使用HandleErrorAttribute濾波器,

[ErrorHandler(ExceptionType = typeof(Exception), View = "UnhandledError", Order = 1)] 
public abstract class BaseController : Controller 

     { 
    } 

基本上就可以有這樣的一個基本控制器的頂部,並定義UnhandledError.cshtml在共享視圖文件夾。

如果要在顯示錯誤消息之前記錄未處理的錯誤,則可以擴展HandleErrorAttribute類並將邏輯在OnException方法內執行日誌記錄。

public class MyErrorHandlerAttribute : HandleErrorAttribute 
    { 


     public override void OnException(ExceptionContext exceptionContext) 
     { 
      Logger.Error(exceptionContext.Exception.Message,exceptionContext.Exception); 
      base.OnException(exceptionContext); 
     } 
    } 
4

爲了完整起見,Global.asax中還有Application_Error處理程序。

2

爲了使這項工作我也跟着下面blog post然後進行<system.web>節點內的下列除了兼具的Web.config文件(根一個和一個在瀏覽文件夾):

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

希望它可以幫助...

3

全球錯誤處理

  1. 在web.config中

    <customErrors mode="On"/>
  2. 錯誤將顯示在Error.cshtml這是駐留在共享文件夾

  3. 變化Error.cshtml
 
    @model System.Web.Mvc.HandleErrorInfo 

    @{ 
     ViewBag.Title = "Error"; } 


    <h2> 
     <p>Sorry, an error occurred while processing your request.</p> 
     <p>Controller Name: @Model.ControllerName</p> 
     <p>Action Name : @Model.ActionName</p> 
     <p>Message: @Model.Exception.Message</p> </h2> 

相關問題