¿Cuál es la mejor práctica al crear sus clases de excepción en una solución .NET: derivar de System.Exception
o de System.ApplicationException
?¿Debo derivar excepciones personalizadas de Exception o ApplicationException en .NET?
Respuesta
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.
ApplicationException
considered useless es un argumento fuerte y crítico contra ApplicationException
.
Disparo: no lo use. Derivar de Exception
.
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
Los autores del marco mismos consideran ApplicationException inútil:
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, que siguen su diseño de la estructura del libro Pautas.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
El tema de la entrada del blog se discute más 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.");
}
}
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.
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. –
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. –
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
La cita sí dice eso, pero está bien, editado para ser más explícito. – Blorgbeard
- 1. Excepciones personalizadas en C++
- 2. ¿Cómo debo almacenar datos dentro de excepciones personalizadas?
- 3. Excepciones personalizadas en Clojure?
- 4. Lanzar excepciones personalizadas en Java
- 5. ¿Está bien derivar de System.ArgumentException?
- 6. ¿Por qué crear excepciones personalizadas?
- 7. Excepciones a C++: ¿Por qué usar o extender std :: exception?
- 8. ¿Por qué siempre debo hacer mis Excepciones [serializable]? (NET)
- 9. cómo crear carriles 3 excepciones personalizadas
- 10. @ApplicationException con Java 1.7
- 11. ¿Capturas múltiples excepciones personalizadas? - C++
- 12. excepciones personalizadas de manipulación - Java Web Services
- 13. ¿Cómo debo registrar excepciones en ASP.NET?
- 14. ¿Cómo crear excepciones personalizadas en Java?
- 15. Cuándo usar excepciones personalizadas contra excepciones existentes frente a excepciones genéricas
- 16. ¿Cómo debo almacenar mis clases personalizadas?
- 17. Lanzar excepciones de un constructor en .NET
- 18. One Exception handler para todas las excepciones de una CLASE
- 19. ¿Cómo debo manejar las excepciones comprobadas en JavaConfig de Spring?
- 20. Manejo de excepciones de C++ personalizadas en Cython
- 21. StackTrace originales/LINENUMBERS en Excepciones .NET
- 22. excepciones que cogen en un hilo .NET
- 23. En DDD dónde guardar excepciones personalizadas (excepciones de la aplicación)? En la capa de infraestructura?
- 24. Excepciones personalizadas: diferenciar a través de muchas subclases o clases individuales respaldadas con enum?
- 25. Establecer InnerException del objeto .NET Exception
- 26. C#: Anulación del método ToString() para excepciones personalizadas
- 27. C++ Excepciones; int o std :: excepción?
- 28. Ruby Exception or Error?
- 29. ¿Cómo debo manejar las excepciones en esta función C#?
- 30. ¿Cómo debo resolver java.lang.IllegalArgumentException: protocol = https host = null Exception?
Increíble cuando uno considera que el material de Microsoft Press para el examen MCTS 70-536 dice claramente lo opuesto ... ¡gah! –
Nunca confíe plenamente en los libros de examen de MS. He leído algunos de ellos, siempre lleno de errores. – user1068352
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? –