2012-05-11 11 views
5

Ho errori personalizzati attivati ​​in webconfig e reindirizzamento a "/ Errore/Problemi". Questo funziona come progettato. Elmah sta registrando l'errore. Anche la vista dell'errore viene visualizzata.asp.net mvc 3 ottiene eccezione generata

Il problema è che desidero controllare l'errore generato nell'azione Problemi del mio controller Errore. Quando viene generato un errore, come puoi accedervi dopo che MVC ti ha reindirizzato al gestore di errori personalizzato?

sto buttando un'eccezione se CurrentUser è nullo:

 if (CurrentUser == null) 
     { 
      var message = String.Format("{0} is not known. Please contact your administrator.", context.HttpContext.User.Identity.Name); 
      throw new Exception(message, new Exception("Inner Exception")); 
     } 

Voglio essere in grado di accedere a questo nel mio gestore di errore personalizzato ("Error/Trouble"). Come accedi all'eccezione?

Ecco la mia azione guai:

public ActionResult Trouble() 
    { 
     return View("Error"); 
    } 

Ecco mio punto di vista:

@model System.Web.Mvc.HandleErrorInfo 

<h2> 
    Sorry, an error occurred while processing your request. 
</h2> 
@if (Model != null) 
{ 
    <p>@Model.Exception.Message</p> 
    <p>@Model.Exception.GetType().Name<br /> 
    thrown in @Model.ControllerName @Model.ActionName</p> 
    <p>Error Details:</p> 
    <p>@Model.Exception.Message</p> 
} 

System.Web.Mvc.HandleErrorInfo è il modello per il mio punto di vista guai ed è vuota. Grazie per l'aiuto.

+0

Vuoi vederlo mentre esegui il debug? – mattytommo

+0

non durante il debug. Voglio che l'azione Problemi verifichi l'errore generato e recuperi il messaggio di errore da mostrare all'utente finale –

risposta

2

ho trovato una soluzione:

in Global.asax faccio questo:

 protected void Application_Error() 
    { 
     var exception = Server.GetLastError(); 

     HttpContext.Current.Application.Lock(); 
     HttpContext.Current.Application["TheException"] = exception; 
     HttpContext.Current.Application.UnLock(); 
    } 

In Errore/Problema faccio questo:

 var caughtException = (Exception)HttpContext.Application["TheException"]; 
     var message = (caughtException!= null) ? caughtException.Message : "Ooops, something unexpected happened. Please contact your system administrator"; 
     var ex = new Exception(message); 
     var errorInfo = new HandleErrorInfo(ex, "Application", "Trouble"); 
     return View("Error", errorInfo); 

Questo è il lavoro. Ma sembra un modo strano per farlo. Qualcuno ha una soluzione migliore? Grazie per l'aiuto.

+0

Probabilmente non è così male come pensi, guardando le domande precedenti sembra una strada da percorrere :) – mattytommo