Para lanzar excepciones, generalmente uso clases de excepción incorporadas, 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í. Luego lanzo y atrapo estos en mi código. Pero hoy me encontré con elApplicationException
clase, ¿debería usar eso en su lugar? ¿Para qué sirve?
Parece ineficiente tener muchas clases de excepción efectivamente idénticas con nombres diferentes (generalmente no necesito ninguna funcionalidad individual). Pero no me gusta la idea de atrapar un genéricoApplicationException
y tener que usar un código adicional para determinar cuál fue el error.
¿Dónde debería ApplicationException
encajar mi código?
c#
.net
exception
exception-handling
James
fuente
fuente
Respuestas:
De acuerdo con los comentarios en msdn:
Derivarlos de
Exception
. Además, no veo ningún problema con la creación de nuevas excepciones para sus casos, siempre que esté justificado. Si encuentra un caso en el que ya hay una excepción en el marco, utilícelo, de lo contrario, cree el suyo.fuente
ApplicationException
es inútil y existe simplemente por la compatibilidad con versiones anteriores?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. Consulte las mejores prácticas para manejar excepciones en MSDN.
Una de las razones más ampliamente difundidas para esto proviene de un ejercicio de Jeffery Richter en las Directrices de diseño de marcos :
Entonces ahí lo tienes. El resumen ejecutivo es que ApplicationException no es dañino , solo inútil .
fuente
Whizbang
decide que quiere tener todas sus excepciones bajo una jerarquía común, usarApplicationException
para ese propósito realmente no ofrecería ninguna ventaja sobre el uso de unaWhizbangException
clase base personalizada . SinApplicationException
embargo, el problema más grave en la jerarquía de excepciones de .net no está relacionado con la incapacidad de separar las excepciones en categorías probablemente relacionadas con la aplicación, probablemente fatales y con problemas locales, junto con la imposibilidad de tener excepciones "compuestas" significativas.finally
bloqueo mientras hay otra excepción pendiente, loscatch
bloques más arriba en la pila de llamadas deben activarse si coinciden con cualquier excepción anidada, pero dejar otras excepciones pendientes para que salga uncatch
bloque procedería a otrocatch
bloque dentro del mismotry
bloque (si alguno fuera adecuado), y al salir de unfinally
bloque con cualquier excepción pendiente saltaría al siguiente exteriorcatch
ofinally
.En el diseño inicial, en .NET 1.0, se planificó que el marco mismo se lanzaría
SystemException
y derivaría; mientras que las aplicaciones de usuario - se lanzaránApplicationException
y derivarán.Pero más tarde, en .NET 2.0, eso se descartó.
Así derivan de
Exception
.fuente