ejemplo - manejo de errores c#
¿Qué excepciones integradas de.NET puedo lanzar desde mi aplicación? (5)
Si necesito lanzar una excepción desde mi aplicación, ¿cuál de las clases de excepciones .NET integradas puedo usar? ¿Son todos un juego limpio? ¿Cuándo debería obtener el mío?
Consulte Creación y lanzamiento de excepciones .
Al arrojar excepciones integradas, dice:
No arroje intencionalmente System.Exception, System.SystemException, System.NullReferenceException o System.IndexOutOfRangeException desde su propio código fuente.
y
No arrojes excepciones generales
Si arroja un tipo de excepción general, como Exception o SystemException en una biblioteca o marco, obliga a los consumidores a detectar todas las excepciones, incluidas excepciones desconocidas que no saben cómo manejar.
En cambio, arroje un tipo derivado más que ya exista en el marco, o cree su propio tipo derivado de Excepción ".
Esta entrada de blog también tiene algunas pautas útiles.
Además, el análisis de código FxCop define una lista de "no subir excepciones" como se describe aquí . Recomienda:
Los siguientes tipos de excepciones son demasiado generales para proporcionar información suficiente al usuario:
- System.Exception
- System.ApplicationException
- System.SystemException
Los siguientes tipos de excepciones están reservados y deben ser lanzados solo por el tiempo de ejecución de lenguaje común:
- System.ExecutionEngineException
- System.IndexOutOfRangeException
- System.NullReferenceException
- System.OutOfMemoryException
En teoría, puede plantear cualquier otro tipo de excepción de marco, siempre que comprenda claramente el propósito de la excepción según lo descrito por Microsoft (consulte la documentación de MSDN).
Tenga en cuenta que estas son "pautas" y, como han dicho otros, existe un debate sobre System.IndexOutOfRangeException (es decir, muchos desarrolladores lanzan esta excepción).
Mi consejo sería enfocarse en dos cosas:
- Escenarios
- Expectativas del usuario
En otras palabras, me siento e identifico:
- ¿Bajo qué escenarios quieres lanzar excepciones?
- En esos escenarios, ¿qué esperarían los usuarios de su API?
La respuesta al n. ° 1 es, por supuesto, específica de la aplicación. La respuesta al n. ° 2 es "cualquier código similar con el que ya estén familiarizados".
El comportamiento que resulta de esto es:
En los escenarios que surgen en los programas que también llegan dentro del marco, como que los argumentos son nulos, están fuera de rango, no son válidos, los métodos no se implementan o simplemente no son compatibles, entonces debe usar las mismas excepciones que utiliza el marco. Las personas que usan sus API esperarán que se comporten de esa manera (porque así es como se comporta todo lo demás), y por lo tanto podrán usar mejor su API desde el principio "get go".
- Para los nuevos escenarios que no existen en el marco, debe seguir adelante e inventar sus propias clases de excepción. Yo diría que debería preferir Exception como su clase base, a menos que sea alguna otra excepción base que proporcione los servicios que necesita. En términos generales, no creo que algo como "ApplicationException" te ayude mucho. Cuando comienzas a definir tus propias excepciones, hay algunas cosas que debes tener en cuenta:
a. El objetivo principal de una excepción es para la comunicación humana. Transmiten información sobre algo que sucedió que no debería tener. Deben proporcionar suficiente información para identificar la causa de un problema y resolver cómo resolverlo.
segundo. La consistencia interna es extremadamente importante. Hacer que tu aplicación se comporte lo más universalmente posible en circunstancias similares hará que los usuarios de la API sean más productivos.
En cuanto a que haya reglas duras y rápidas sobre lo que debería y no debería hacer ... no me preocuparía por esas cosas. En cambio, solo me enfocaría en identificar escenarios, encontrar la excepción existente que se ajusta a esos escenarios y luego diseñar cuidadosamente la suya propia si no existe una existente.
Puedes crear y lanzar prácticamente cualquiera de ellos, pero generalmente no deberías. Como ejemplo, las diversas excepciones de validación de argumentos (ArgumentException, ArgumentNullException, ArgumentOutOfRangeException, etc.) son adecuadas para su uso en código de aplicación, pero AccessViolationException no lo es. ApplicationException se proporciona como una clase base adecuada para cualquier clase de excepción personalizada que pueda necesitar.
Consulte este artículo de MSDN para obtener una lista de las mejores prácticas: se refiere al manejo de excepciones, pero también contiene buenos consejos para crearlas ...
Uso ArgumentException
(y sus "amigos") regularmente.
NotSupportedException
y NotImplementedException
también son comunes.
Sobre el tema de System.Exception
y System.ApplicationException
: este último fue pensado para ser utilizado como la clase base de todas las excepciones personalizadas. Sin embargo, esto no se ha aplicado sistemáticamente desde el principio. En consecuencia, existe una controversia acerca de si esta clase debe usarse en lugar de utilizar System.Exception
como la clase base para todas las excepciones.
De cualquier forma que decidas, nunca arrojes directamente una instancia de estas dos clases. En realidad es una pena que no estén abstact
. Por lo que vale, siempre intente usar la excepción más específica posible. Si no hay ninguno que cumpla con sus requisitos, siéntase libre de crear el suyo propio. En este caso, sin embargo, asegúrese de que su excepción tenga un beneficio sobre las excepciones existentes. En particular, debe transmitir su significado a la perfección y proporcionar toda la información necesaria para manejar la situación de una manera significativa.
Evite crear excepciones de stubs que no hagan nada significativo. En la misma línea, evite crear grandes jerarquías de clases de excepción, rara vez son útiles (aunque puedo imaginar una o dos situaciones en las que las usaría ... un analizador sintáctico sería una de ellas).