Je pense que MVC, ASP et votre infrastructure de gestion de journalisation / exception préférée peuvent très bien gérer vos objectifs. ELMAH et Enterprise Library offrent tous deux une gestion et une journalisation des exceptions facile à utiliser. Choisissez donc votre logiciel favori. Je ne vais pas aborder ici le pour et le contre de chacun.
REMARQUE: vous ne pouvez pas afficher de page d'erreur conviviale ET renvoyer un HTTP 404 ou 500, comme le suggère votre question. Lorsque vous renvoyez une page d'erreur conviviale, le code HTTP renvoyé à votre navigateur est 302. Il s'agit d'une redirection vers la page d'erreur conviviale.
Pages d'erreur conviviales
Il semble que vous puissiez atteindre vos objectifs grâce aux bons paramètres Web.config qui font partie d’ASP.net depuis un certain temps. Vous avez mentionné l'affichage d'informations de débogage lorsque vous êtes dans le développement et l'affichage de pages conviviales en production. Vous pouvez utiliser la section des erreurs personnalisées de web.config pour cela (Définissez CustomErrors = "Off" pour afficher les informations de débogage). Je vais supposer que vous connaissez l'attribut CustomErrors, sinon lisez ceci:
http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx
Si vous avez besoin d'une plus grande précision du contrôle sur les vues d'erreur que vous affichez, utilisez l'attribut HandleError de MVC. De cette façon, vous pouvez choisir différentes vues d'erreur pour chaque action / contrôleur.
http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx
Enregistrement des exceptions
Il semble que vous souhaitiez répondre à toutes vos exceptions de la même manière ("Enregistrez les erreurs et envoyez-les par e-mail à l'administrateur en production"). Si tel est le cas, l’option la plus simple est d’ajouter du code à
Application_Error (expéditeur d'objet, EventArgs e)
dans votre global.asax. C’est là que vous pouvez passer au cadre de journalisation choisi.
Si vous souhaitez davantage de contrôle sur la journalisation / la gestion des exceptions, vous pouvez sous-classer HandleErrorAttribute et remplacer
OnException(System.Web.Mvc.ExceptionContext filterContext)
C’est un autre endroit où vous pouvez passer au cadre de journalisation que vous avez choisi.
https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror
Cela vous donne plus de contrôle que la technique Application_Error mentionnée ci-dessus.
En général, MVC vous offre une grande granularité dans le contrôle de la gestion des erreurs. Si vous n'avez pas besoin de ce contrôle, vous pouvez utiliser les méthodes ASP.net, telles que la définition de pages d'erreur sur votre web.config.