Evento System.AppDomain.UnhandledException
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
El UnhandledException evento proporciona una notificación de excepciones no detectadas. Permite que la aplicación registre información sobre la excepción antes de que el controlador predeterminado del sistema notifique la excepción al usuario y finalice la aplicación. Si hay suficiente información sobre el estado de la aplicación disponible, se pueden realizar otras acciones, como guardar datos del programa para la recuperación posterior. Se recomienda precaución, ya que los datos del programa pueden dañarse cuando no se controlan las excepciones. El controlador también se ejecutará mientras se mantienen los bloqueos que se mantienen cuando se produjo la excepción, por lo que se debe tener cuidado para evitar esperar a otros recursos que podrían introducir interbloqueos.
Este evento se puede controlar en cualquier dominio de aplicación. Sin embargo, el evento no se genera necesariamente en el dominio de aplicación donde se produjo la excepción. Una excepción solo se controla si toda la pila del subproceso se ha desenredado sin encontrar un controlador de excepciones aplicable, por lo que el primer lugar en el que se puede generar el evento se encuentra en el dominio de aplicación donde se originó el subproceso.
Si el UnhandledException evento se controla en el dominio de aplicación predeterminado, se genera allí para cualquier excepción no controlada en cualquier subproceso, independientemente del dominio de aplicación en el que se inició el subproceso. Si el subproceso se inició en un dominio de aplicación que tiene un controlador de eventos para UnhandledException, el evento se genera en ese dominio de aplicación. Si ese dominio de aplicación no es el dominio de aplicación predeterminado y también hay un controlador de eventos en el dominio de aplicación predeterminado, el evento se genera en ambos dominios de aplicación.
Por ejemplo, supongamos que un subproceso se inicia en el dominio de aplicación "AD1", llama a un método en el dominio de aplicación "AD2" y, desde allí, llama a un método en el dominio de aplicación "AD3", donde produce una excepción. El primer dominio de aplicación en el que se puede generar el UnhandledException evento es "AD1". Si ese dominio de aplicación no es el dominio de aplicación predeterminado, el evento también se puede generar en el dominio de aplicación predeterminado.
Nota:
Common Language Runtime suspende las anulaciones del subproceso mientras se ejecutan controladores de eventos para el UnhandledException evento.
Si el controlador de eventos tiene un ReliabilityContractAttribute atributo con las marcas adecuadas, el controlador de eventos se trata como una región de ejecución restringida.
A partir de .NET Framework 4, este evento no se genera para excepciones que dañan el estado del proceso, como desbordamientos de pila o infracciones de acceso, a menos que el controlador de eventos sea crítico para la seguridad y tenga el HandleProcessCorruptedStateExceptionsAttribute atributo .
Para registrar un controlador de eventos para este evento, debe tener los permisos necesarios o se produce una SecurityException excepción .
Para obtener más información sobre el manejo de eventos, consulte controlar y provocar eventos.
Otros eventos para excepciones no controladas
Para determinados modelos de aplicación, el UnhandledException evento puede ser reemplazado por otros eventos si la excepción no controlada se produce en el subproceso de aplicación principal.
En las aplicaciones que usan Windows Forms, las excepciones no controladas en el subproceso de aplicación principal hacen que se genere el Application.ThreadException evento. Si se controla este evento, el comportamiento predeterminado es que la excepción no controlada no finaliza la aplicación, aunque la aplicación se deja en un estado desconocido. En ese caso, el UnhandledException evento no se genera. Este comportamiento se puede cambiar mediante el archivo de configuración de la aplicación o mediante el método para cambiar el Application.SetUnhandledExceptionMode modo a UnhandledExceptionMode.ThrowException antes de que se conecte el ThreadException controlador de eventos. Esto solo se aplica al subproceso de aplicación principal. El UnhandledException evento se genera para excepciones no controladas producidas en otros subprocesos.
El marco de trabajo de la aplicación de Visual Basic proporciona otro evento para excepciones no controladas en el subproceso de aplicación principal, el WindowsFormsApplicationBase.UnhandledException evento . Este evento tiene un objeto de argumentos de evento con el mismo nombre que el objeto de argumentos de evento utilizado por AppDomain.UnhandledException, pero con propiedades diferentes. En concreto, este objeto de argumentos de evento tiene una ExitApplication propiedad que permite a la aplicación seguir ejecutándose, ignorando la excepción no controlada (y dejando la aplicación en un estado desconocido). En ese caso, el AppDomain.UnhandledException evento no se genera.