Creo que MVC, ASP y su marco de manejo de excepciones / registro favorito pueden manejar sus objetivos bastante bien. ELMAH y Enterprise Library proporcionan un manejo y un registro de excepciones fáciles de usar, así que elige tu favorito. No voy a entrar en los pros y los contras de cada uno aquí.
NOTA: no puede mostrar una página de error amigable Y devolver un HTTP 404 o 500 como sugiere su pregunta. Cuando devuelva una página de error amigable, el código HTTP devuelto a su navegador será 302. Esta es una redirección a la página de error amigable.
Páginas de error amigables
Parece que puedes lograr tus objetivos con la buena configuración de web.config que ha sido parte de ASP.net durante algún tiempo. Usted menciona que muestra información de depuración cuando está en desarrollo y que muestra páginas amigables en producción. Puede usar la sección de errores personalizados de web.config para esto (establezca CustomErrors="Off" para mostrar información de depuración). Asumiré que está familiarizado con el atributo CustomErrors, si no lee esto:
enlace
Si necesita una mayor granularidad de control sobre las vistas de error que muestra, use el atributo HandleError de MVC. De esta manera, puede elegir diferentes vistas de error para cada Acción / Controlador.
enlace
Registro de excepciones
Parece que desea responder a todas sus excepciones de la misma manera ('Registrar errores y enviarlos por correo electrónico al administrador en producción'). Si este es el caso, su opción más simple es agregar código a
Application_Error (objeto remitente, EventArgs e)
en su global.asax. Aquí es donde puede pasar al marco de registro elegido.
Si desea tener más control sobre su registro / manejo de excepciones, puede subclase HandleErrorAttribute y anular
OnException(System.Web.Mvc.ExceptionContext filterContext)
este es otro lugar donde puede pasar al marco de registro elegido.
enlace
Esto le da más control que la técnica Application_Error mencionada anteriormente.
En general, MVC le brinda una gran granularidad de control sobre cómo manejar los errores.
Si no necesita este control, puede recurrir a las formas de ASP.net de hacer cosas como definir páginas de error en su web.config.