2009-08-31 29 views
7

Powiedzmy umieścić następujący kod gdzieś na stronie wzorcowej w mojej witrynie ASP.NET MVC:Globalny obsługi błędów (poza z kontrolera) w ASP.NET MVC

throw new ApplicationException("TEST"); 

nawet z [HandleError] atrybutu umieszczony na moim kontrolerze, ten wyjątek nadal się psuł. Jak radzić sobie z takimi błędami? Chciałbym móc przejść do strony błędu i nadal móc rejestrować szczegóły wyjątku.

Jaki jest najlepszy sposób postępowania z czymś takim?

Edycja: Jednym z rozwiązań, które rozważałem byłoby dodanie nowego kontrolera: UnhandledErrorController. Czy mogę wstawić metodę Application_Error w Global.asax, a następnie przekierować do tego kontrolera (gdzie decyduje, co zrobić z wyjątkiem)?

Uwaga: defaultRedirect w elemencie customErrors element web.config nie przekazuje informacji o wyjątku.

+1

ApplicationException jest rzeczywiście anty-praktyka w dzisiejszych czasach, proszę zobacz: http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx Zastanów się tylko rzucając nowe (...); – Stephanvs

Odpowiedz

5

Ponieważ MVC jest zbudowany na asp.net, powinieneś być w stanie zdefiniować globalną stronę błędu w web.config, tak jak w formularzach internetowych, np.

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

Jak mogę odzyskać szczegóły wyjątku? – user10789

1

O ile co do wyświetlania strony, musisz stworzyć customErrors section w Twojej web.config i ustawić go na jakikolwiek stan kodów, które chcesz obsługiwać.

Przykład:

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

miarę rejestrowania wyjątków, polecam korzystania ELMAH. Integruje się dobrze z witrynami ASP.NET MVC.

+0

Tak, HandleError tak naprawdę nie zrobi niczego, chyba że masz customErrors w konfiguracji. – swilliams

+0

Nadal muszę mieć możliwość pobierania i rejestrowania szczegółów wyjątku. Zwykle byłbym w stanie to zrobić w działaniu kontrolera, do którego wskazuje defaultRedirect. – user10789

+0

@iguananet To właśnie robi ELMAH. Jeśli chcesz zrobić to osobno, to zupełnie inna sprawa, ale działa bardzo dobrze. Gorąco polecam spróbować. – Joseph

5

Możesz utworzyć filtr, który wygląda na wyjątek w metodzie OnActionExecuted:

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

Następnie można umieścić [WatchException] na kontrolerze lub metody działania, a to niech wyjątków zalogować. Jeśli masz dużo Kontrolerów, może to być uciążliwe, więc jeśli masz zwykłego kontrolera podstawowego, możesz zastąpić OnActionExecuted i zrobić to samo. Wolę metodę filtrowania.

10

Włącz CustomErrors:

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

i przekierować do kontrolera zwyczaj błędzie:

[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

W jakiej części webconfig muszę umieścić niestandardowe błędy? – Zapnologica

Powiązane problemy