2009-06-15 4 views
15

Credo di aver impostato la nostra app MVC per utilizzare correttamente [HandleError]. Questo è il mio controller:ASP.NET MVC HandleError non funziona (customErrors è impostato su "On")

[HandleError] 
public class SupportController : BaseController { 

    public ActionResult Toss() { 
     throw new Exception("uh oh"); 
    } 
    // snip 
} 

E io hanno impostare il mio tag customErrors in web.config su "On":

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

Tuttavia, ancora sto ottenendo lo schermo giallo della morte sulle eccezioni. L'impostazione di un punto di interruzione nell'azione Toss() mostra che HttpContext.IsCustomErrorEnabledè impostato su su true.

Non stiamo facendo nulla con il motore di visualizzazione, e il BaseController non ha problemi con nessuno (e altri controller che non lo estendono hanno lo stesso problema).

Sto sviluppando su Windows XP e ho lo stesso problema quando l'app viene distribuita su un server 2003 box (IIS 6).

Non credo che ci sia un'eccezione sulla pagina error.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
</asp:Content> 

Una cosa che può essere diverso è che questa applicazione è stato creato indietro quando MVC Beta è la versione più recente, ed è stato aggiornato alla RC e poi RTM come sono stati rilasciati. Potevano esserci stati degli assurdi ambienti che sono rimasti da lì?

Posso farlo funzionare su altre app, quindi sono un po 'sconcertato.

+0

La tua pagina error.aspx in ~ \ Views \ Support o ~ \ Views \ Shared? – Talljoe

+0

~ \ Views \ Shared - even tried [HandleError (View = "~/Views/Shared/Error.aspx")] (non ha funzionato) – swilliams

risposta

19

Questo tende ad accadere se c'è un problema nell'elaborazione della pagina di errore .. se si esegue il debug dell'applicazione, subito dopo l'eccezione iniziale il problema si ripercuoterà su un'altra (eccezione dalla pagina di errore). il motivo per me era perché avevo una pagina principale fortemente tipizzata, la pagina di errore stava usando questa pagina master, e poiché la pagina master condivide lo stesso modello della pagina effettiva, la pagina master stava ottenendo un modello HandlerErrorInfo, invece del modello digitato Mi aspettavo ..

Personalmente penso che questo sia un design scarso in asp.net mvc (insieme al resto), ma è possibile aggirare questo abbastanza facile non usando la stessa pagina principale (si potrebbe anche fare l'ereditarietà della pagina principale in cui si ha una pagina principale fortemente tipizzata ereditata che si limita a io nherits lo strato da quello non tipizzato ..

Altrimenti si tratta di una sorta di eccezione che si verifica nella visualizzazione dell'errore .. (molto probabilmente).

+1

Non eri del tutto al 100%, ma mi hai messo sulla giusta strada . La Pagina Master non ha un modello, ma fa cose che presumibilmente lanciavano un'eccezione di riferimento nulla. Funziona con una vista impaginata non master. Grazie! – swilliams

+1

Felice di aiutare, un sacco di punti di mal di testa in asp.net mvc, mi sembra di continuare a trovarli e ho pensato di salvare alcune azioni di "testa a tastiera". :) – meandmycode

+0

Da un po 'di tempo da questo post, ma è stato utile anche per me, – Craig

2

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 %> 
+0

Sì, questo era il problema per me, grazie. –

0

Dopo molte tirate di capelli, ho scoperto che il mio problema rientra nella categoria generale di "lancio dell'eccezione dal codice solo per generare un altro errore durante il rendering della vista dell'errore."Avevo scritto una pagina di errore fortemente tipizzata in anticipo aspettando un System.Exception, quindi quando passai a utilizzare l'attributo [HandleError], il filtro passava la pagina di errore a System.HandleErrorInfo. La seconda eccezione avveniva a questa linea (in Default.aspx.cs):.

httpHandler.ProcessRequest(HttpContext.Current); 

Confondere

1

ho avuto un lo stesso problema, e dopo avere indagato, ho scoperto che ero l'aggiornamento del file web.Debug.config sotto web.config

Poi ho creato il. il tag CustomErrors nel file web.config e stava funzionando g per me.

0

Ho continuato a incontrare un problema simile. Sono stato in grado di ottenere un risultato desiderabile con questo "hack".

Poiché tutti i miei controller estendono un BaseController, questo funziona ovunque.

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 

     Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>"); 

     base.OnException(filterContext); 

    } 

} 
1

mi sono imbattuto in un problema simile di recente. Si è scoperto che il metodo nel controllore che genera l'eccezione (HomeController) veniva chiamato da un metodo in un controller diverso (DispatchController).

Abbiamo dovuto posizionare la proprietà [HandleError] sul controller chiamante per farlo funzionare.

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")] 
public class DispatchController : Controller 
{ 

Abbiamo anche inserito la vista di errore personalizzata nella struttura di cartelle per il controller chiamante.
View folder showing custom error view in the Dispatch controller folder