Para lanzar excepciones, generalmente uso clases de excepción incorporadas, por ejemplo, ArgumentNullExceptiony 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 ApplicationExceptionencajar 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
ApplicationExceptiones 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
Whizbangdecide que quiere tener todas sus excepciones bajo una jerarquía común, usarApplicationExceptionpara ese propósito realmente no ofrecería ninguna ventaja sobre el uso de unaWhizbangExceptionclase base personalizada . SinApplicationExceptionembargo, 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.finallybloqueo mientras hay otra excepción pendiente, loscatchbloques 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 uncatchbloque procedería a otrocatchbloque dentro del mismotrybloque (si alguno fuera adecuado), y al salir de unfinallybloque con cualquier excepción pendiente saltaría al siguiente exteriorcatchofinally.En el diseño inicial, en .NET 1.0, se planificó que el marco mismo se lanzaría
SystemExceptiony derivaría; mientras que las aplicaciones de usuario - se lanzaránApplicationExceptiony derivarán.Pero más tarde, en .NET 2.0, eso se descartó.
Así derivan de
Exception.fuente