2012-01-03 10 views
20

Sto costruendo un sito di e-commerce MVC 3.0. Voglio evitare di attaccare blocchi try-catch su tutto il mio codice.Modo pulito per catturare tutti gli errori generati in un'applicazione MVC 3.0?

La domanda è piuttosto semplice - Qual è una buona strategia per catturare tutti gli errori che vengono lanciati sul mio sito web? Voglio sapere tutti loro ... quindi posso lavorare per portare quel numero a 0 una volta che il sito è attivo. Ho intenzione di scrivere ogni errore in un logger e anche di inviarlo via email.

Ho letto un po 'su come catturarlo nel file global.asax ... ma ho anche letto che non li ha TUTTI.

Qualcuno ha qualche suggerimento o può indicarmi una buona direzione?

+1

Mi piacciono tutte le risposte ... ho provato quello di ELMAH e lo adoro. L'ho installato in modo facile e lo sostituirò completamente con il mio scadente registratore. Mi piacerebbe vedere alcuni voti/commenti per assicurarmi che ELMAH sia la strada da percorrere ... –

+0

Sono d'accordo! ELMAH è fantastico ed è molto semplice da configurare. Ho usato ELMAH in numero di progetti con successo. – azamsharp

risposta

21

Il modo MVC di risolvere quel problema sono filtri. Se sei già su MVC3, i filtri globali sono per te. C'è un tipo speciale di filtro per gli errori di consegna: il filtro HandleError. This article descrive molto del suo utilizzo.

Si potrebbe implementare Possiedi un filtro e controllare ogni aspetto della di eccezioni non gestite, ad esempio:

public class HandleExceptionsAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     var expception = filterContext.Exception; 

     // custom code here.. 
    } 
} 

Infine, se si vuole avere tutte le eccezioni non gestite da memorizzare e loggato, ELMAH cioè ELMAH.MVC è la scelta migliore. Installarlo utilizzando il NuGet package, configurarlo e tutti i dati saranno accessibili da un collegamento come ad esempio:

http://yourapp/admin/elmah/

Il mio suggerimento è quello di non usare qualcosa di simile Application_Error in Global.asax. cs.

+0

Sono andato su questa strada. Tutto è stato praticamente impostato per me usando nuget, che è fantastico. Unica trappola: le persone devono assicurarsi di proteggere il loro file elmah.axd. Anche quando metti autorizza attr sul controller elmah, puoi comunque andare a elmah.axd. Se lo blocchi, assicurati di non poter fare qualcosa come /a/b/c/d/elmah.axd ... quindi ci vuole un po 'di lavoro. –

+0

Non preoccuparti di elmah.axd, ti preghiamo di rimuoverlo dal tuo web.config! Purtroppo non posso farlo automaticamente. Una volta installato Elmah.MVC, si avrà la rotta http: // app/admin/elmah registrata. Nessun problema per proteggerlo con l'attributo [Autorizza]; –

+0

alcuni dettagli qui: http://www.beletsky.net/2011/03/integrating-elmah-to-aspnet-mvc-in.html –

2

È possibile gestire qualsiasi eccezione generata in Global.asax.

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    // global handling code goes here 

    Server.ClearError(); 
} 
+0

Questo sembra suscettibile alle condizioni di gara. –

+3

Anche questo non funziona – War

Problemi correlati