2012-05-11 14 views
5

Tengo errores personalizados activados en webconfig y redirigiendo a "/ Error/Problema". Esto está funcionando según lo diseñado. Elmah está registrando el error. La vista de error también se muestra.asp.net mvc 3 obtener excepción lanzada

El problema es que quiero inspeccionar el error lanzado en la acción Problema de mi controlador de errores. Cuando se produce un error, ¿cómo se accede a él después de que MVC lo haya redireccionado al controlador de error personalizado?

estoy lanzando una excepción si CurrentUser es nulo:

 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")); 
     } 

Quiero ser capaz de acceder a este en mi controlador de errores personalizado ("Error/Trouble"). ¿Cómo accedes a la excepción?

Aquí está mi acción problemas:

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

Aquí es mi opinión:

@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 es el modelo para mi punto de vista y problemas que está vacío. Gracias por tu ayuda.

+0

¿Quieres verlo mientras estás depurando? – mattytommo

+0

no durante la depuración. Quiero que la acción de Problema inspeccione el error arrojado y recupere el mensaje de error para mostrar al usuario final –

Respuesta

2

He encontrado una solución:

en Global.asax hago esto:

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

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

por error/problema hago esto:

 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); 

Esto está funcionando. Pero parece una forma extraña de hacerlo. ¿Alguien tiene una solución mejor? Gracias por tu ayuda.

+0

Probablemente no sea tan malo como cree, mirando las preguntas anteriores parece una manera de hacerlo :) – mattytommo