2009-08-31 13 views
7
errore globale

Diciamo che ho messo il seguente codice da qualche parte in una pagina master nel mio sito ASP.NET MVC:movimentazione (al di fuori del controllo) in ASP.NET MVC

throw new ApplicationException("TEST"); 

Anche con un attributo [HandleError] posto sul mio controller, questa eccezione continua a scoppiare. Come posso affrontare errori come questo? Mi piacerebbe essere in grado di indirizzare a una pagina di errore ed essere ancora in grado di registrare i dettagli delle eccezioni.

Qual è il modo migliore per gestire qualcosa di simile?

Modifica: una soluzione che stavo considerando sarebbe quella di aggiungere un nuovo controller: UnhandledErrorController. Posso inserire un metodo Application_Error in Global.asax e quindi reindirizzare a questo controller (dove decide cosa fare con l'eccezione)?

Nota: il valore predefinitoRedirect nell'elemento web.config customErrors non passa lungo le informazioni sulle eccezioni.

+1

ApplicationException è in realtà un anti-pratica al giorno d'oggi, si prega di vedere: http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx Considerare solo il lancio di una nuova Eccezione zione (...); – Stephanvs

risposta

5

Poiché MVC è basato su asp.net, dovresti essere in grado di definire una pagina di errore globale in web.config, proprio come si potrebbe nei moduli Web ad es.

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

Quindi come posso recuperare i dettagli dell'eccezione? – user10789

1

Per quanto riguarda ciò che la pagina per visualizzare, avrete bisogno di creare un customErrors section nel web.config e configurarlo per qualsiasi stato di codici che si desidera gestire.

Esempio:

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

Per quanto riguarda le eccezioni di registrazione, mi consiglia di utilizzare ELMAH. Si integra perfettamente con i siti MVC di ASP.NET.

+0

Sì, HandleError in realtà non farà nulla a meno che non ci siano CustomErrors nella configurazione. – swilliams

+0

Devo ancora essere in grado di recuperare e registrare i dettagli delle eccezioni. Preferibilmente, sarei in grado di farlo nell'azione del controller a cui punta il parametro DefaultRedirect. – user10789

+0

@iguananet Questo è ciò che ELMAH fa. Se vuoi farlo separatamente, è tutta un'altra questione, ma funziona molto bene. Consiglio vivamente di provarlo. – Joseph

5

È possibile creare un filtro che cerca un'eccezione nel metodo OnActionExecuted:

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

allora si può mettere [WatchException] su un controller o di un metodo d'azione, e vi permetterà di log eccezioni. Se disponi di molti controller, potrebbe essere noioso, quindi se disponi di un controller di base comune puoi eseguire l'override di OnActionExecuted e fare la stessa cosa. Preferisco il metodo di filtraggio.

10

Abilita customErrors:

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

e reindirizzare a un controller di errore personalizzato:

[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

In quale parte del webconfig è necessario inserire gli errori personalizzati? – Zapnologica

Problemi correlati