Penso che MVC, ASP e il tuo framework preferito per la registrazione / gestione delle eccezioni possano gestire i tuoi obiettivi abbastanza bene. ELMAH ed Enterprise Library forniscono entrambi una gestione delle eccezioni e una registrazione facili da usare, quindi scegli il tuo preferito ... Non ho intenzione di andare sui pro e contro di ciascuno qui.
NOTA: non è possibile visualizzare una pagina di errore intuitiva E restituire un HTTP 404 o 500 come suggerisce la domanda. Quando si restituisce una pagina di errore descrittiva, il codice HTTP restituito al browser sarà 302. Si tratta di un reindirizzamento alla pagina di segnalazione descrittiva.
Pagine di errore amichevoli
Sembra che tu possa raggiungere i tuoi obiettivi dalle buone impostazioni web.config vecchio stile che fanno parte di ASP.net da qualche tempo. Si menziona la visualizzazione delle informazioni di debug durante lo sviluppo e la visualizzazione di pagine amichevoli in produzione. A tale scopo è possibile utilizzare la sezione degli errori personalizzati di web.config (Impostare CustomErrors = "Off" per mostrare le informazioni di debug). Presumo che tu abbia familiarità con l'attributo CustomErrors, se non leggi questo:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Se è necessaria una maggiore granularità di controllo sulle visualizzazioni degli errori visualizzate, utilizzare l'attributo HandleError di MVC. In questo modo è possibile scegliere diverse visualizzazioni di errore per ciascuna azione / controller.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Registrazione delle eccezioni
Sembra che tu voglia rispondere a tutte le tue eccezioni allo stesso modo ("Registra errori e inviali via e-mail all'amministratore in produzione"). In questo caso, l'opzione più semplice è aggiungere il codice
Application_Error (mittente oggetto, EventArgs e)
nel tuo global.asax. Qui è possibile passare al framework di registrazione scelto.
Se si desidera un maggiore controllo sulla registrazione / gestione delle eccezioni, è possibile sottoclassare HandleErrorAttribute e sovrascrivere
OnException(System.Web.Mvc.ExceptionContext filterContext)
questo è un altro posto in cui è possibile passare al framework di registrazione scelto.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Questo ti dà un maggiore controllo rispetto alla tecnica Application_Error menzionata sopra.
In generale MVC offre una granularità di controllo su come gestire gli errori. Se non hai bisogno di questo controllo, puoi ricorrere ai modi ASP.net di fare cose come la definizione di pagine di errore sul tuo web.config.