2011-04-19 14 views
8

Hoy, cuando escribo una pieza de código como el siguiente excepción:La implementación interna de manejar

try 
{ 
    ... 
} 
catch (Exception e) 
{ 
    ... 
} 

de repente se da cuenta de que la declaración

catch (Exception e) 
{ 
    ... 
} 

es tanto como una declaración de la función. Y recuerdo vagamente que el manejo de excepciones implica algún tipo de caminar/manipulación de la pila.

Entonces, ¿en qué se compila exactamente el código de manejo de excepciones anterior? Tengo la sensación de que el código anterior es solo una sintaxis especial/conveniente para facilitar nuestra codificación, pero de hecho, ¿tal vez nuestro código está envuelto en una función de manejo de excepciones autogenerado? Espero haber sido claro.

+0

Además de los recursos previstos @siride Creo que desea buscar en el artículo [Microsoft Enterprise Library 5.0 Control de excepciones Bloquear] (http://msdn.microsoft.com/en-us/library /ff664698%28v=PandP.50%29.aspx). Hay recursos en ese enlace y la capacidad de descargar el código fuente del bloque de la aplicación que podría ayudarlo a encontrar lo que está buscando. _note_ No ** estoy ** recomendando que use el bloque de código al por mayor, pero creo que inspeccionar el código y la explicación del código lo ayudará a aprender lo que quiere saber. –

Respuesta

9

Afortunadamente para usted, el arquitecto de CLR Chris Brumme escribió una larga explicación de cómo funciona el manejo de excepciones en el CLR. Ahora, esto fue escrito hace ocho años y algunos de los detalles son ligeramente diferentes hoy, pero al menos esto debería darle un buen comienzo.

http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

+0

Impresionante; no es frecuente encontrar una publicación de blog que podría servir como un capítulo completo en un libro. –

+0

Gracias Eric, me has ayudado mucho. – smwikipedia

6

Este es un buen punto de partida: http://msdn.microsoft.com/en-us/library/5b2yeyab.aspx#how_the_runtime_manages_exceptions

Básicamente, son algo así como las funciones, pero no realmente. No se les llama, per se, no tienen un marco de pila separado (o una pila separada, para el caso), utilizando en su lugar el marco de pila de la función actual. Es por eso que puedes acceder a las variables locales.

Si desea ver en qué se compila, puede usar ILDasm.exe para descompilar un ensamblaje que tiene bloques de excepción (haga un programa de ejemplo y descompílelo). Alternativamente, use el Reflector de RedGate para una mejor experiencia de descompilación.

Si la IL no es suficiente, puede obtener el ensamblado generado ejecutando su programa en modo de depuración en Visual Studio, estableciendo un punto de interrupción en su método y luego cuando se toca ese punto de interrupción, abriendo la pestaña/ventana de desensamblaje del menú Depurar.

+0

Gracias, también ayuda. Pero solo puedo marcar una respuesta. – smwikipedia

Cuestiones relacionadas