Control de excepciones en la API de generación de perfiles
Las notificaciones de excepción son las más difíciles de describir y entender de todas las notificaciones. En este tema se describe el procesamiento de excepciones y se explica cómo la API de generación de perfiles administra varios tipos de excepciones.
Diagrama de flujo de notificación de excepciones
El procesamiento de excepciones es inherentemente complejo. Las notificaciones de excepción descritas en este tema proporcionan toda la información que requiere un generador de perfiles sofisticado para hacer el seguimiento del paso (fase de búsqueda o fase de desenredo), el cuadro, filter y el bloque finally que se ejecuta para cada subproceso del proceso perfilado. Las notificaciones de excepción no proporcionan ningún ThreadID, pero es posible llamar al método ICorProfilerInfo::GetCurrentThreadID para detectar qué subproceso administrado ha producido la excepción.
La ilustración siguiente muestra cómo el generador de perfiles del código recibe varias devoluciones de llamada cuando supervisa eventos de excepción. Cada subproceso empieza en el estado de ejecución normal. Cuando el subproceso está en un estado dentro del sistema de excepciones (en la fase de búsqueda o en la fase de desenredo), lo controla el sistema de excepciones. Cualquier devolución de llamada no relacionada con excepciones (por ejemplo, ICorProfilerCallback::ObjectAllocated) que se produzca mientras el subproceso está en uno de estos estados se puede atribuir al propio sistema de excepciones. Cuando el subproceso está en un estado fuera del sistema de excepciones, está ejecutando código administrado arbitrario.
Secuencia de devolución de llamada de excepción
Excepciones anidadas
Los subprocesos que se crucen con código administrado al procesar una excepción pueden producir otra excepción, que produciría un nuevo paso completo por el control de excepciones. (Este nuevo paso se indica mediante "Nuevo paso por el control de excepciones" en la ilustración anterior.) Si este tipo de excepción anidada escapa de los bloques filter/finally/catch de la excepción original, esto puede afectar a la excepción original de la manera siguiente:
Si la excepción anidada se produjo dentro de un bloque filter y escapa del bloque filter, se considerará que filter devuelve false y continuará el primer paso.
Si la excepción anidada se produjo dentro de un bloque finally y escapa del bloque finally, el procesado de la excepción original nunca se reanudará.
Si la excepción anidada se produjo dentro de un bloque catch y escapa del bloque catch, el procesado de la excepción original nunca se reanudará.
Controladores no administrados
Una excepción se puede controlar en código no administrado. En este caso, el generador de perfiles verá la fase de desenredo pero no recibirá notificación de controladores catch. La ejecución se reanudará normalmente en el código no administrado. Un generador de perfiles compatible con código no administrado podrá detectar esta situación, pero un generador de perfiles que solamente sea compatible con código administrado podrá ver varias cosas, entre las que se encuentran las siguientes:
Una devolución de llamada ICorProfilerCallback::UnmanagedToManagedTransition cuando el código no administrado llame o vuelva al código administrado.
Finalización del subproceso (si el código no administrado estuviera en la raíz del subproceso).
Finalización de la aplicación (si el código no administrado finaliza la aplicación).
Controladores CLR
El propio Common Language Runtime (CLR) puede administrar una excepción. En este caso, el generador de perfiles verá la fase de desenredo pero no recibirá notificación de controladores catch. Puede ver que la ejecución se reanuda normalmente en código administrado o no administrado.
Excepciones no controladas.
De forma predeterminada, una excepción no controlada conducirá a la terminación del proceso en la versión 2.0 de .NET Framework. Puede forzar la adhesión a la directiva de excepciones de .NET Framework 1 usando una marca de compatibilidad de aplicaciones, tal y como se describe en Excepciones en subprocesos administrados.