2009-08-31 75 views
7

比方說,我把下面的代碼在某處母版頁在我的ASP.NET MVC網站:全局錯誤在ASP.NET處理(控制器外)MVC

throw new ApplicationException("TEST"); 

即使有[的HandleError]屬性放在我的控制器上,這個異常仍然起泡。我該如何處理這樣的錯誤?我希望能夠路由到一個錯誤頁面,並仍然能夠記錄異常詳細信息。

處理類似這樣的事情的最佳方法是什麼?

編輯:我正在考慮的一種解決方案是添加一個新的控制器:UnhandledErrorController。我可以在Global.asax中放入一個Application_Error方法,然後重定向到這個控制器(它決定如何處理異常)?

注意:customErrors web.config元素中的defaultRedirect不會傳遞異常信息。

+1

ApplicationException的其實是時下的反慣例,請見:http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx 考慮只是拋出新的Excep重刑(...); – Stephanvs 2009-08-31 18:56:11

回答

5

由於MVC建立在asp.net之上,因此您應該能夠在web.config中定義一個全局錯誤頁面,就像您可以在web表單中一樣。

<customErrors mode="On" defaultRedirect="~/ErrorHandler" /> 
+7

那麼我將如何檢索異常詳細信息? – user10789 2009-08-31 17:31:50

1

至於要顯示的頁面,你需要創建你的web.config一個customErrors section並將其設置爲要處理任何狀態代碼。

例子:

<customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly"> 
    <error statusCode="500" redirect="InternalError.htm"/> 
</customErrors> 

至於日誌例外,我會建議使用ELMAH。它與ASP.NET MVC網站很好地集成。

+0

是的,HandleError實際上不會做任何事情,除非你在配置中有customErrors。 – swilliams 2009-08-31 17:32:05

+0

我仍然需要能夠檢索並記錄異常詳細信息。最好是,我可以在defaultRedirect指向的控制器操作中執行此操作。 – user10789 2009-08-31 17:35:22

+0

@iguananet這就是ELMAH所做的。如果你想單獨做這件事,那完全是另一回事,但它運作得很好。我強烈建議嘗試一下。 – Joseph 2009-08-31 18:04:43

5

您可以創建一個過濾器,查找在OnActionExecuted方法異常:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class WatchExceptionAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
    if (filterContext.Exception != null) { 
     // do your thing here. 
    } 
    } 
} 

然後你就可以把[WatchException]上的控制器或操作方法,它將讓記錄異常。如果你有很多控制器,這可能是乏味的,所以如果你有一個通用的基本控制器,你可以在那裏覆蓋OnActionExecuted並做同樣的事情。我更喜歡過濾方法。

10

啓用的customErrors:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="401" redirect="~/Error/Unauthorized" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

和重定向到一個自定義錯誤控制器:

[HandleError] 
public class ErrorController : BaseController 
{ 
    public ErrorController() 
    { 
    } 

    public ActionResult Index() 
    { 
     Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     return View ("Error"); 
    } 

    public ActionResult Unauthorized() 
    { 
     Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
     return View ("Error401"); 
    } 

    public ActionResult NotFound() 
    { 
     string url = GetStaticRoute (Request.QueryString["aspxerrorpath"] ?? Request.Path); 
     if (!string.IsNullOrEmpty (url)) 
     { 
      Notify ("Due to a new web site design the page you were looking for no longer exists.", false); 
      return new MovedPermanentlyResult (url); 
     } 

     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View ("Error404"); 
    } 
} 
+0

在我需要放置自定義錯誤的webconfig的哪個部分? – Zapnologica 2015-04-08 19:10:34