2008-09-09 10 views

Respuesta

57

Según Jeffery Richter en el libro directrices de diseño de marco:

System.ApplicationException es una clase que no deben formar parte del marco .NET.

Tenía la intención de tener algún significado en el sentido de que podría atrapar "todas" las excepciones de la aplicación, pero no se siguió el patrón, por lo que no tiene ningún valor.

+2

Increíble cuando uno considera que el material de Microsoft Press para el examen MCTS 70-536 dice claramente lo opuesto ... ¡gah! –

+0

Nunca confíe plenamente en los libros de examen de MS. He leído algunos de ellos, siempre lleno de errores. – user1068352

+0

Esto realmente no responde la pregunta. ¿Estás diciendo que las excepciones de aplicaciones personalizadas deberían heredar de 'Exception'? Si es así, ¿podría decirlo? –

18

ApplicationException considered useless es un argumento fuerte y crítico contra ApplicationException.

Disparo: no lo use. Derivar de Exception.

+0

Sí, Konrad tiene razón. En una nota relacionada: otra cosa que se considera útil (o "mejor práctica") pero que realmente no lo es [implementando ICloneable] (http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx) – Craig

1

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."); 
    } 
} 

Se permite hacer la diferencia entre:

  • C# sistema de código de error que debo reparaciones.
  • Error de usuario "normal" que no necesita corrección mía.

Sé que no se recomienda el uso de ApplicationException, pero funciona muy bien ya que hay very few classes que no respetan el patrón ApplicationException.

+2

Muy pocas de las que conoces. Cualquiera que siga las Pautas de diseño del marco no se derivará de ApplicationException. Si desea mantener este patrón, debe crear su propio tipo, como MyApplicationExcptionBase, y derivar todas sus excepciones personalizadas de eso. Por cierto, las directrices dicen que crear algunos tipos de excepciones derivadas. –

+0

Tiene razón: hoy, si tuviera que empezar de cero, crearé una excepción de "UserError". Sin embargo, no voy a refactorizar mi código anterior: no es muy crítico. –

21

Debe derivar excepciones personalizadas de System.Exception.

Incluso MSDN ahora dice ignorar ApplicationException:

Si está diseñando una aplicación que necesita para crear sus propios excepciones, se aconseja derivar excepciones personalizadas de la clase Exception .Originalmente se pensó que las excepciones personalizadas deberían derivar de la clase ApplicationException; sin embargo, en la práctica esto no ha sido que se ha encontrado que agrega un valor significativo. Para más información, vea Best Practices for Handling Exceptions.

http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

+1

La cita sí dice eso, pero está bien, editado para ser más explícito. – Blorgbeard

Cuestiones relacionadas