2009-06-06 12 views
9

Ho una classe controller di base in cui sto eseguendo l'override del metodo Controller.OnExcezione del gestore per fornire una gestione degli errori generica per determinati tipi di controller che erediteranno da questa classe (questi sono i controller API che restituiscono i risultati JSON). Il metodo OnException non viene mai chiamato quando viene sollevata un'eccezione dal controller. Qualcuno vede cosa sto facendo male, o c'è un modo migliore per gestire questa situazione?ASP.NET MVC Controller.OnException non viene chiamato

Utilizzando MVC 1.0

fondo:

public class APIController : Controller 
    { 

     protected override void OnException(ExceptionContext filterContext) 
     { 
      //This is never called 
      filterContext.Result = 
       new JsonResult(); 
      base.OnException(filterContext); 
     } 


    } 

Ereditare Classe:

public class MyController : APIController 
    { 
public AjaxResult ForcedException() 
     { 
      throw new SystemException(); 
     } 
} 
+0

"Il metodo OnException non viene mai chiamato quando viene sollevata un'eccezione dal controller" - lo hai verificato con il debugger? Non è chiaro dalla tua domanda. –

+0

L'ho provato dal debugger e utilizzando le istruzioni del registro e eseguendolo all'esterno del debugger. Nessuno dei due sembra funzionare per me. –

risposta

-1

applicare l'attributo [HandleError] alla classe.

10

Se ho compreso correttamente la tua domanda, la tua Eccezione deve essere contrassegnata come "gestita" nella tua OnException. Prova questo:

filterContext.ExceptionHandled = true; 
+0

questo ha funzionato per me – benpage

+11

Sono piuttosto perplesso su come questa sia la risposta alla domanda ... – nashwan

+0

meno 1. non risponde affatto alla domanda. – ken2k

2

La documentazione MSDN (http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx) afferma che il metodo OnException viene "chiamato quando si verifica un'eccezione non gestita in azione."

Quindi, sembra che potrebbe sparare solo quando si verifica un'eccezione non gestita in un metodo di azione.

Ho creato un nuovo controller con un'azione Index. E il metodo OnException, infatti, viene eseguito. Ho anche provato a lanciare un SystemException() e anche il metodo OnException ha sparato.

public ActionResult Index () 
    { 
     throw new NotImplementedException (); 
    } 
1

Stai chiamando l'azione del controller da un test di unità o tramite ASP.NET? Se si chiama il metodo direttamente in un test, ad esempio tramite NUnit, OnException non verrà attivato: il framework di test gestirà l'eccezione e la trasformerà in un test non riuscito.

1

Avevo esattamente lo stesso problema nel mio progetto ASP.NET MVC 3.

Si scopre che questa è una funzionalità di Visual Studio e del server di sviluppo. Quando si è in modalità di debug, si tornerà a Visual Studio e verrà visualizzata la finestra di dialogo delle eccezioni predefinita.

Un modo per evitare che questo succeda è quello di modificare la modalità di compilazione della tua Web.config da questo:

<compilation debug="true" targetFramework="4.0"> 

A tal:

<compilation debug="false" targetFramework="4.0"> 

Si può anche lasciare la modalità di debug è impostata su true, ma prova la tua applicazione funziona scegliendo il Start without debugging option dal menu di Visual Studio (invocato premendo Ctrl+F5.

0

Le stesse regole si applicano per Controller.OnException come per HandleErrorAttribute

La configurazione richiesta per HandleErrorAttribute è notato qui https://stackoverflow.com/a/528550/939634

Se avete customError nel vostro web.config set per mode="RemoteOnly" e il debug a livello locale o avete mode="Off" la le eccezioni non verranno gestite e vedrai la schermata gialla di ASP.Net con una traccia dello stack.

Se si imposta mode="On" o si sta visualizzando il sito in remoto e si dispone del mode="RemoteOnly" il metodo OnException verrà eseguito correttamente.

Problemi correlati