Gdy wystąpi błąd w mojej aplikacji ASP.NET MVC 4, chciałbym dostosować widok dla użytkownika w zależności od rodzaju błędu. Na przykład strona nie została znaleziona lub wystąpił wyjątek (z pewnymi przyjaznymi dla użytkownika szczegółami dotyczącymi wyjątku). Sprawdziłem inne przykłady tego, jak to zrobić w StackOverflow i innych źródłach internetowych, ale żadna z odpowiedzi nie działa dla mnie.ASP.NET MVC 4 - Obsługa wyjątków nie działa
Podstawowy atrybut [HandleError] prawdopodobnie nie działa w VS2012 z aplikacją MVC 4 targetującą .NET 4.5. Oto kod mam w moim kontrolera głównego:
[HandleError]
public ActionResult Index()
{
Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
throw new NullReferenceException("Uh oh, something broke.");
}
To jest po prostu rzuca wyjątek, a spodziewałbym widok domyślny ~/Shared/Error.cshtml być zwrócone z powodu [HandleError] atrybutu ale dostaję tylko wewnętrzny błąd serwera HTTP 500 wskazujący, że strona nie mogła zostać wyświetlona. Sprawdziłem mój web.config i różne konfiguracje wydają się dziwnie zachowywać. W sekcji tej chwili zawiera:
<customErrors mode="On" />
(Próbowałem dodanie defaultRedirect iz trybie CustomErrors = „Off”, jak dobrze, ale to nie ma żadnego wpływu ... ani wspólny pogląd o błędzie lub Widok CustomError jest renderowany. Jeśli zmienię tryb customErrors na wyłączony, wtedy widzę szczegóły wyjątku zgodnie z oczekiwaniami, więc poprawnie zgłaszam wyjątek "Uh oh, coś złamanego". dodanie do programu HomeController procedury obsługi wyjątku OnException i chociaż mogę przeprowadzić debugowanie i zobaczyć, że zdarzenie OnException jest podnoszone, nie ma to znaczenia:
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
if (filterContext == null)
{
filterContext.Result = View("CustomError");
return;
}
Exception e = filterContext.Exception;
// TODO: Log the exception here
ViewData["Exception"] = e; // pass the exception to the view
filterContext.Result = View("CustomError");
}
Próbowałem również zmianę [HandleError], aby określić widok, ale to nie wydaje się robić nic albo:
[HandleError(View="CustomError")]
Każda pomoc będzie mile widziane. Daj mi znać, jeśli potrzebujesz więcej informacji.
Mimo że nie używam 'RemoteOnly' w dowolnym miejscu w web.config, mój oryginalny kod zdaje się działać zdalnie, tylko nie lokalnie! To bardzo mnie zaskakuje. Musiałem dodać ' ' w sekcji '' pliku web.config, aby widoki mogły być renderowane, ale wydaje się to normalne. Utrudnia to debugowanie lokalnie i wydaje się być błędem, ponieważ 'mode = RemoteOnly' nie jest używany. Jeśli ktokolwiek dowie się, jak uruchomić to na miejscu, daj mi znać. (Mogę w szczególności otworzyć drugie pytanie). –