2012-05-11 22 views
5

Mam niestandardowe błędy włączone w webconfig i przekierowujące do "/ Error/Trouble". Działa to zgodnie z założeniami. Elmah rejestruje błąd. Wyświetlany jest również widok błędu.asp.net mvc 3 pobierz wyjątek

Problem polega na tym, że chcę sprawdzić zgłoszony błąd w akcji dotyczącej problemu z moim kontrolerem błędów. Kiedy pojawia się błąd, w jaki sposób uzyskujesz do niego dostęp po przekierowaniu przez MVC do niestandardowej procedury obsługi błędów?

Rzucam wyjątek, jeśli CurrentUser jest zerowy:

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

Chcę być w stanie uzyskać dostęp do tego w moim obsługi niestandardowych błędów („Error/Trouble”). Jak uzyskać dostęp do wyjątku?

Oto moja akcja kłopot:

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

Oto mój widok:

@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 jest modelem dla mnie problemem i jest ona pusta. Dzięki za pomoc.

+0

Chcesz to zobaczyć podczas debugowania? – mattytommo

+0

nie podczas debugowania. Chcę, aby akcja Trouble sprawdzała zgłaszany błąd i wyświetlała komunikat o błędzie, aby wyświetlić użytkownikowi końcowemu. –

Odpowiedz

2

znalazłem rozwiązania:

w Global.asax zrobić to:

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

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

W błąd/Trouble to zrobić:

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

to działa. Ale wydaje się, że to dziwny sposób. Czy ktoś ma lepsze rozwiązanie? Dzięki za pomoc.

+0

To prawdopodobnie nie jest tak źle, jak myślisz, patrząc na poprzednie pytania wydaje się, że jest to sposób na wykonanie :) – mattytommo