2009-06-04 9 views
8

Esto probablemente sea poco realista, pero ¿sería posible permitir que un componente sea notificado de todas las excepciones de primera oportunidad que ocurren en su proceso?.NET - ¿Escucha de excepción de la primera oportunidad para una depuración intensiva?

Tenemos algunos componentes de terceros (contratados por nosotros) que no hacen otra cosa que comer excepciones y la política de la relación comercial hace que toda la prueba sea un dolor real.

También sabemos que algunos de nuestros códigos realizan la acción decepcionante de dejar que las excepciones desaparezcan en el abismo en lugar de utilizar nuestro registrador de excepciones centralizado.

Asumo nuestra aplicación tendría que iniciar como un proceso hijo de una aplicación de depuración para lograr el efecto, pero calculo que vale la pena preguntar :)

Respuesta

2

Net 4.0 ha agregado realmente el evento AppDomain.FirstChanceException. Dispara antes de que se ejecute cualquier bloque catch.

Este MSDN article tiene algunos ejemplos.

Básicamente, usted sólo tiene que añadir un controlador de eventos como éste:

AppDomain.CurrentDomain.FirstChanceException += 
     (object source, FirstChanceExceptionEventArgs e) => 
     { 
      Console.WriteLine("FirstChanceException event raised in {0}: {1}", 
       AppDomain.CurrentDomain.FriendlyName, e.Exception.Message); 
     }; 
+0

¡Muy buen hallazgo! ¡Muchas gracias por desempolvar esta vieja pregunta! – STW

7

Puede utilizar la API de .NET de perfiles para obtener notificaciones de excepciones en todo tipo de estados, estos son los métodos disponibles:

ExceptionThrown 
ExceptionSearchFunctionEnter 
ExceptionSearchFunctionLeave 
ExceptionSearchFilterEnter 
ExceptionSearchFilterLeave 
ExceptionSearchCatcherFound 
ExceptionOSHandlerEnter 
ExceptionOSHandlerLeave 
ExceptionUnwindFunctionEnter 
ExceptionUnwindFunctionLeave 
ExceptionUnwindFinallyEnter 
ExceptionUnwindFinallyLeave 
ExceptionCatcherEnter 
ExceptionCatcherLeave 
ExceptionCLRCatcherFound 
ExceptionCLRCatcherExecute 

uso de la API de perfiles no es del todo para los débiles de corazón; Eche un vistazo a http://msdn.microsoft.com/en-us/library/ms404386.aspx como un punto de entrada para su investigación y http://msdn.microsoft.com/en-us/library/bb384687.aspx específicamente para el manejo de excepciones.

No estoy al tanto de una forma sencilla de hacerlo dentro de su código administrado como

AppDomain.FirstChanceException += new EventHandler... 

evento o similar.

EDITAR: Una mejor alternativa es utilizar el unamanaged debugging API en su lugar.

Básicamente puede establecer una devolución de llamada ICorManagedCallback/ICorManagedCallback2 utilizando ICorDebug::SetManagedHandler y obtener devoluciones de llamadas cuando se producen excepciones.

No tengo suficiente experiencia en esta área para saber cuáles son las ventajas/desventajas de la API de creación de perfiles.

Acabo de echar un vistazo a mdgb sample que usa las API de ICorDebug y parece obtener suficientes notificaciones de excepciones (para ver rápidamente qué eventos ocurren, establezca un punto de interrupción en el método HandleEvent en corapi/Debugger.cs: 406)

+0

no esperaba que fuera fácil, sino un todo terreno en todo lo que necesito es a por lo menos tener una idea de ella. ¡Muchas gracias! – STW

+0

Edité mi respuesta ya que después de jugar con mdbg, creo que posiblemente la API ICorDebug podría ser una mejor manera de hacerlo. –

Cuestiones relacionadas