2011-04-01 13 views
16

Muchas veces, se menciona que solo detecta excepciones que puedo manejar (arrojar, envolver y/o registrar, o realizar otras acciones).¿Qué tipos de excepción no se detectan?

¿Qué excepciones no se pueden manejar? ¿Es este el mismo significado que no debe ser atrapado? Sé que las excepciones que pueden representar una referencia de objeto como nula no deben ser capturadas, ya que son errores de programación y no provocados por el usuario. ¿Hay algún otro ejemplo? Otro es ExecutionEngineException.

Además, ¿el curso de acción en un bloque catch siempre se produce entre re-lanzamiento, reinicio y registro? ¿Hay algún caso en el que deba realizarse alguna otra acción en un bloque catch?

Gracias

+4

Realmente no entiendo esta pregunta. Usted * sabe * qué excepciones puede manejar. Es a los que ha escrito específicamente * code * en el manejador de excepciones que debe manejar. Son los que puedes * arreglar *. ** Si no está seguro, no puede manejarlos, por lo que no debería atraparlos. ** –

+0

Las respuestas a esta pregunta también pueden ser útiles: http://stackoverflow.com/q/7152354/625332 – Dmitry

Respuesta

15

Se aplica el consejo habitual, solo capte lo que puede manejar. Hay una función de utilidad llamada IsCriticalException dentro del marco que es bastante comúnmente utilizada por partes del código de marco para decidir si se traga o no una excepción. Bien podría ser por eso. Se considera la siguiente crítica:

  • NullReferenceException
  • StackOverflowException (inalcanzable)
  • OutOfMemoryException
  • ThreadAbortException
  • ExecutionEngineException (inalcanzable en 4.0)
  • IndexOutOfRangeException
  • AccessViolationException

Es una buena lista.

+1

No es necesario que las aplicaciones escritas correctamente conozcan esta lista porque tratarán todas las aplicaciones no controladas. lo mismo: simplemente dejarán que CLR termine el proceso. No se tragarán todo excepto una lista_de_excepciones_que_se_considera_para_ser_crítico_por_Microsoft.VisualStudio.Shell.10.0. Es interesante saber que ese método existe. – Dmitry

+0

[¿Es esta la propiedad de la que está hablando?] (Http://msdn.microsoft.com/en-us/library/vstudio/microsoft.visualstudio.errorhandler.iscriticalexception.aspx) No veo ninguna otra similar manejadores. – Will

+1

System.ClientUtils.IsCriticalException, es un método interno. –

12

me gustaría utilizar el consejo de Eric Lippert y no capturar las excepciones "fatal":

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

+0

aquí está la jerarquía de excepciones para C# http://msdn.microsoft.com/en-us/library/z4c5tckx(v=vs.vvs.80).aspx – m4tt1mus

+1

Eric también sugiere no detectar las excepciones "Boneheaded", ya que hacerlo esconde errores en tu código – Brian

+0

El enlace correcto es [Jerarquía de excepciones] (http://msdn.microsoft.com/en-us/library/z4c5tckx.aspx) –

0

El curso de acción en un bloque catch puede no ser siempre volver a lanzar, envoltura/retrow y Iniciar sesión. He visto que una excepción de db, como un interbloqueo, causa una excepción y luego la lógica de captura intenta realizar la acción de la base de datos nuevamente con la esperanza de que el recurso bloqueado ya no esté bloqueado.

Cuestiones relacionadas