Pregunta

Este es probablemente poco realista, pero ¿sería posible habilitar un componente para ser notificado de todas las excepciones de primera oportunidad que ocurren en su proceso?

Tenemos algo de terceros (contratado por nosotros) componentes que fallan en hacer otra cosa que comer excepitions y la política de la relación de negocios hacen de toda la prueba un dolor real.

También somos conscientes de que algunos de nuestro código está realizando la acción de dejar decepcionante excepciones se desvanecen en el abismo en lugar de utilizar nuestro registrador excepción centralizada.

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:)

¿Fue útil?

Solución

Net 4.0 en realidad ha añadido el evento AppDomain.FirstChanceException . Se dispara antes de ejecutar cualquier bloque catch.

Esta MSDN artículo tiene algunos ejemplos.

Básicamente que acaba de añadir un controlador de eventos de esta manera:

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

Otros consejos

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; echar un vistazo a http://msdn.microsoft.com/en-us/ biblioteca / ms404386.aspx como punto de partida para su investigación y http : //msdn.microsoft.com/en-us/library/bb384687.aspx para la manipulación de excepción específicamente.

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

AppDomain.FirstChanceException += new EventHandler...

evento o similar.

EDIT: A posiblemente mejor alternativa es usar la API depuración unamanaged lugar.

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

No estoy suficiente experiencia en esta área para saber cuáles son las ventajas / desventajas son el API de perfiles.

Yo sólo tenía un aspecto en el > mdgb muestra, que utiliza las API ICorDebug y parece ser bastante suficientes notificaciones de excepciones (ver rápidamente qué eventos se producen, establece un punto de interrupción en el método handleEvent en Corapi / Debugger.cs: 406)

scroll top