Para qué es ApplicationException in.NET?


Para lanzar excepciones, normalmente uso clases de excepción integradas, por ejemplo, ArgumentNullException y NotSupportedException. Sin embargo, a veces necesito usar una excepción personalizada y en ese caso escribo:

class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }

Y así sucesivamente. Entonces los tiro y los cojo en mi código. Pero hoy me encontré con la clase ApplicationException - ¿debería usar eso en su lugar? ¿Para qué es?

Parece ineficiente tener muchas clases de excepción efectivamente idénticas con nombres diferentes (normalmente no necesito ninguna funcionalidad individual). Pero no me gusta la idea de atrapar un ApplicationException genérico y tener que usar código adicional para determinar cuál fue el error.

¿Dónde debería encajar ApplicationException mi código?

Author: James, 2011-04-16

3 answers

De acuerdo con las observaciones en msdn:

Las aplicaciones de usuario, no el tiempo de ejecución del lenguaje común, generan excepciones personalizadas derivadas de la clase ApplicationException. La clase ApplicationException diferencia entre excepciones definidas por aplicaciones y excepciones definidas por el sistema.

Si está diseñando una aplicación que necesita crear sus propias excepciones, se le recomienda derivar excepciones personalizadas de la clase Exception. Fue originalmente se pensó que las excepciones personalizadas deberían derivar de la clase ApplicationException; sin embargo, en la práctica no se ha encontrado que esto agregue un valor significativo. Para obtener más información, consulte Prácticas recomendadas para el manejo de excepciones.

Derivarlos de Exception. Además, no veo ningún problema con la creación de nuevas excepciones para sus casos, siempre y cuando se justifique. Si encuentra un caso en el que ya hay una excepción en el marco, use eso, de lo contrario, ruede el suyo propio.

 84
Author: Femaref,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-16 10:36:37

La respuesta corta es: en ninguna parte.

Es una reliquia del pasado, donde Microsoft pretendía que los desarrolladores heredaran todas sus excepciones personalizadas de ApplicationException. Poco después, cambiaron de opinión y aconsejaron que las excepciones personalizadas se derivaran de la clase de excepción base. Ver Mejores Prácticas para Manejar Excepciones en MSDN.

Una de las razones más difundidas para esto proviene de un esfuerzo de Jeffery Richter en El Diseño del marco Directrices:

Sistema.ApplicationException es una clase que no debería formar parte de.NET Framework. La idea original era que las clases derivadas de SystemException indicarían excepciones lanzadas desde el CLR (o sistema) en sí, mientras que las excepciones no CLR se derivarían de ApplicationException. Sin embargo, muchas clases de excepción no siguieron este patrón. Por ejemplo, TargetInvocationException (que es lanzado por el CLR) se deriva de ApplicationException. Así, la clase ApplicationException perdió todo significado. La razón para derivar de esta clase base es permitir que algún código más alto de la pila de llamadas capture la clase base. Ya no era posible captar todas las excepciones de aplicación.

Así que ahí lo tienes. El resumen ejecutivo es que ApplicationException no es perjudicial, solo inútil.

 120
Author: Quick Joe Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-10 12:15:53

En el diseño inicial, en.NET 1.0, se planeó que el marco en sí lanzará SystemException y derivado; mientras que las aplicaciones de usuario lanzarán ApplicationException y derivado.

Pero más tarde, en.NET 2.0, eso fue eliminado.

Así se derivan de Exception.

 17
Author: abatishchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-16 10:44:22