2009-03-06 9 views
39

In due diverse applicazioni, una personalizzata l'altra l'applicazione MVC di esempio che si ottiene con un nuovo progetto MVC VS2008, [HandleError] non rileva eccezioni.ASP.net MVC [HandleError] not catching exceptions

Nell'applicazione di esempio ho:

[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
     throw new Exception(); 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

che è solo il controller di default con un'eccezione che sono gettati per il test.

Ma non funziona. Invece di andare alla pagina error.aspx predefinita mostra le informazioni di debug nel browser.

Il problema è stato ritagliato in un'applicazione personalizzata su cui sto lavorando e che mi ha portato a testarlo con l'applicazione di esempio. Pensando che avesse qualcosa a che fare con le modifiche apportate all'applicazione personalizzata, ho lasciato l'applicazione di esempio completamente invariata con l'eccezione (yuck) del lancio nel metodo dell'indice.

Sono perplesso. Cosa mi manca?

risposta

65

Nel web.config, cambiamento customErrors:

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

Se la modalità è spento o RemoteOnly, poi si vedrà lo schermo giallo della morte al posto della pagina di errore personalizzata. Il ragionamento è che gli sviluppatori di solito vogliono le informazioni più dettagliate sullo schermo giallo della morte.

+4

Che ha fatto. Grazie. –

+3

Ho fatto questo e non ha funzionato. Quello che ho scoperto è che in una applicazione MVC2 ci sono più di un file Web.config nel modello predefinito. È necessario applicare il tag customErrors nella root, la maggior parte di Web.config nella soluzione. – Mike

+0

@Mike, è vero per tutte le versioni MVC. –

15

Importante: Fare attenzione che la pagina di errore non abbia un errore!

Se si finisce con quella pagina di errore personalizzata di ASP.NET e si finisce per girare in tondo e strapparsi i capelli. Basta rimuovere tutto dalla pagina che potrebbe causare un errore e testarlo.

Anche per quanto riguarda "CustomErrors" che è ON o OFF ci sono diversi fattori che contribuiscono a mostrare o meno la pagina di errore descrittivo (your Errors.aspx) o meno.

Vedi this blog (ad eccezione di seguito)

HttpContext.IsCustomErrorEnabled - guarda tre diverse fonti

  1. < distribuzione del web.config > superfici di vendita di sezione. Questa è una proprietà utile da impostare quando si distribuisce l'applicazione in un server di produzione . Questo sostituisce qualsiasi altra impostazione per errori personalizzati.
  2. La proprietà della modalità della sezione CustomErrors > della proprietà CustomErrors di web.config . Questa impostazione indica se gli errori personalizzati sono abilitati a e, in tal caso, se sono abilitati solo per le richieste remote, .
  3. La proprietà IsLocal dell'oggetto HttpRequest. Se gli errori personalizzati sono abilitati a solo per richieste remote, è necessario sapere se la richiesta proviene da un computer remoto .

L'idea qui è che si può avere girato 'customErrors' OFF durante lo sviluppo - quando si vuole vedere gli errori, e quindi attivarlo per la sola produzione.

Questo MSDN article discute ulteriormente l'attributo.

13

Un altro motivo per questo problema potrebbe essere,

Nel modello MVC Application (generata da VS2008/VS2008 espresso), Error.aspx (generato da VS) utilizza pagina master.

Se la Pagina master accede a qualsiasi ViewData, verrà generata un'eccezione di riferimento null, quindi error.aspx non verrà visualizzato.

Usa questo semplice codice come Error.aspx, che possa risolvere il problema, (insieme a CustomErrors = On)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
+4

"Se la Pagina Master accede a qualsiasi ViewData getterà l'eccezione di riferimento null "quella riga mi ha restituito la sanità mentale. Grazie! –

8

Ho lottato con questo così e credo che ho capito il problema ora.

In breve i requisiti per avere [HandleError] lavoro come previsto sono:

È necessario abilitare gli errori personalizzati in web.config E si deve anche specificare dove la visualizzazione di errore è nel tag <customErrors>.

Esempio:

<customErrors mode="On" defaultRedirect="Error" /> 

Lasciando fuori la parte defaultRedirect="Error" sarà invece produrrà un errore 500 nel browser - non la pagina di errore ASP.NET (YSOD).

Inoltre non è necessario essere in modalità di rilascio. Ho provato questo con una build di debug e ha funzionato bene.

Il mio ambiente era Visual Studio 2010 utilizzando .NET 4 e il modello di progetto standard "Applicazione Web ASP.NET MVC 2".

Ciò che mi ha confuso era la documentazione MSDN per la classe HandleErrorAttribute. Non dice esplicitamente che è necessario attivare gli errori personalizzati in web.config. E ho pensato che tutto ciò di cui avevo bisogno fosse l'attributo [Handle Error].

+0

Ha fatto esattamente questo e ha ancora lo stesso problema. maggiori dettagli qui: http://stackoverflow.com/questions/11231165/asp-net-mvc-errorhandler-not-showing-custom-error-page – user20358

+0

Sto ancora ricevendo un errore 500 nel browser !! – user20358

4

C'è una situazione stupida che una volta è accaduta con me, quindi potrebbe essere utile per qualcuno.

Assicurarsi di aver aggiunto <customErrors mode="On" /> al corretto file di web.config.


A volte (soprattutto, quando si lavora con qualcosa come ReSharper, e aprire i file con digitando il loro nome, ma non tramite Esplora soluzioni), si può semplicemente aprire un web.config o dalla cartella o addirittura Visualizzazioni da un altro progetto.

+0

Non saprò mai perché hanno deciso che avevano bisogno di due web configs :( – martijn

+0

Il "secondo" è per il motore Razor stesso.Potenzialmente puoi posizionare le tue viste ovunque, quindi il progetto potrebbe non avere il web.config (come per il progetto web) o vuoi le tue impostazioni separate Sono d'accordo, potrebbe essere stato fatto in qualche altro modo per prevenire tali errori nella codifica, ma generalmente ha un senso. – Agat

1

attenzione: nel mio caso stavo cercando di ottenere l'attributo HandleError di prendere un exception gettato all'interno del Controller s costruttore! Certo che non lo prenderà. L'attributo HandleError rileva solo eccezioni generate all'interno delle azioni Controller. E 'proprio lì nella pagina di MSDN (dovrebbe aver pagato più attenzione a quello):

Rappresenta un attributo che viene utilizzato per gestire un'eccezione che è lanciata da un metodo di azione.

Un'altra cosa che stava accadendo è che non è mai stato chiamato il metodo sovrascritto del controller OnException(ExceptionContext exceptionContext). Di nuovo: ovviamente non verrebbe chiamato poiché stavo lanciando un'eccezione all'interno del costruttore di Controller.

Ho trascorso 1 ora cercando di capirlo. : o) Spero che aiuti l'anima successiva ...

Come suggerimento: ricorda che l'attributo HandleError rileva solo errori 500. Per gli altri si dovrebbe dichiarare la sezione <customErrors> in Web.config:

<customErrors mode="On"> 
    <error statusCode="403" redirect="~/403" /> 
    <error statusCode="404" redirect="~/404" /> 
</customErrors>