¿Debo derivar excepciones personalizadas de Exception o ApplicationException en .NET?

StackOverflow https://stackoverflow.com/questions/52753

  •  09-06-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top