Myślę, że MVC, ASP i twoja ulubiona struktura rejestrowania / obsługi wyjątków może całkiem dobrze poradzić sobie z twoimi celami. Zarówno ELMAH, jak i biblioteka Enterprise Library zapewniają łatwą w obsłudze obsługę wyjątków i rejestrowanie, więc wybierz swoją ulubioną. Nie będę tutaj omawiał zalet i wad każdego z nich.
UWAGA: nie można wyświetlić przyjaznej strony błędu ORAZ zwrócić HTTP 404 lub 500, jak sugeruje pytanie. Po zwróceniu przyjaznej strony błędu kod HTTP zwrócony do przeglądarki to 302. Jest to przekierowanie do przyjaznej strony błędu.
Przyjazne strony błędów
Wygląda na to, że możesz osiągnąć swoje cele dzięki dobrze zaprojektowanym ustawieniom web.config, które były częścią ASP.net od pewnego czasu. Wspominasz o pokazywaniu informacji debugowania w fazie projektowania i wyświetlaniu przyjaznych stron w produkcji. W tym celu możesz użyć sekcji niestandardowych błędów pliku web.config (Ustaw CustomErrors = „Wyłącz”, aby wyświetlić informacje debugowania). Zakładam, że znasz atrybut CustomErrors, jeśli nie przeczytaj tego:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Jeśli potrzebujesz większej szczegółowości kontroli nad wyświetlanymi widokami błędów, użyj atrybutu HandleError MVC. W ten sposób możesz wybrać różne widoki błędów dla każdej akcji / kontrolera.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Rejestrowanie wyjątków
Wygląda na to, że chcesz reagować na wszystkie wyjątki w ten sam sposób („Rejestruj błędy i wysyłaj je e-mailem do administratora w produkcji”). W takim przypadku najprostszą opcją jest dodanie kodu
Błąd_aplikacji (nadawca obiektu, EventArgs e)
w twoim global.asax. W tym miejscu możesz przejść do wybranej struktury rejestrowania.
Jeśli chcesz mieć większą kontrolę nad rejestrowaniem / obsługą wyjątków, możesz podklasować HandleErrorAttribute i przesłonić
OnException(System.Web.Mvc.ExceptionContext filterContext)
jest to kolejne miejsce, w którym możesz przejść do wybranej struktury rejestrowania.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Daje to większą kontrolę niż technika Application_Error wspomniana powyżej.
Zasadniczo MVC zapewnia dużą kontrolę nad sposobem obsługi błędów. Jeśli nie potrzebujesz tej kontroli, możesz powrócić do metod ASP.net, takich jak definiowanie stron błędów w pliku web.config.