¿Debo derivar excepciones personalizadas de Exception o ApplicationException en .NET?
Pregunta
¿Cuál es la mejor práctica al crear clases de excepción en una solución .NET?Derivar de System.Exception
o de System.ApplicationException
?
Solución
Según Jeffery Richter en el libro Framework Design Pautas:
System.ApplicationException
es una clase que no debería ser parte del marco .NET.
Se pretendía que tuviera algún significado en el sentido de que potencialmente se podrían detectar "todas" las excepciones de la aplicación, pero no se siguió el patrón y, por lo tanto, no tiene valor.
Otros consejos
Debe derivar excepciones personalizadas de System.Exception
.
Incluso MSDN ahora dice que se ignore ApplicationException
:
Si está diseñando una aplicación que necesita crear sus propias excepciones, se le recomienda obtener excepciones personalizadas de la clase de excepción.Originalmente se pensó que las excepciones personalizadas deberían derivarse de la clase ApplicationException;Sin embargo, en la práctica no se ha encontrado que esto agregue un valor significativo.Para más información, ver Mejores prácticas para manejar excepciones.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationException
considerado inútil es un argumento fuerte y crítico en contra ApplicationException
.
Resultado:no lo uses.derivar de Exception
.
Los propios autores del marco consideran que ApplicationException no tiene valor:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
con un buen seguimiento aquí:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
En caso de duda, sigo su libro Pautas de diseño de marcos.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
El tema de la publicación del blog se analiza con más detalle allí.
rp
Estoy acostumbrado a hacer:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
Permite hacer la diferencia entre:
- Error del sistema de código C# que debo reparar.
- Error de usuario "normal" que no necesita corrección por mi parte.
Sé que no se recomienda usar ApplicationException, pero funciona muy bien ya que hay muy pocas clases que no respetan el patrón ApplicationException.