Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Evento AppDomain.UnhandledException

 

Publicado: octubre de 2016

Se produce cuando no se detecta una excepción.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

public event UnhandledExceptionEventHandler UnhandledException

Este evento proporciona una notificación de las excepciones no detectadas. Permite que la aplicación registrar información sobre la excepción antes de que el controlador predeterminado del sistema notifica la excepción al usuario y finaliza la aplicación. Si hay suficiente información sobre el estado de la aplicación, pueden llevarse a cabo otras acciones, como guardar los datos de programa para su posterior recuperación. Se recomienda con precaución, ya que pueden dañar los datos de programa cuando no se controlan las excepciones.

System_CAPS_noteNota

En las versiones 1.0 y 1.1 de .NET Framework, opciones de depuración y finalización de la aplicación se notifican al usuario antes de que se genera este evento, en lugar de una vez.

Este evento se puede administrar en cualquier dominio de aplicación. Sin embargo, el evento no se produce necesariamente en el dominio de aplicación donde se produjo la excepción. Una excepción está controlada solo si se ha desenreda la pila completa para el subproceso sin encontrar un controlador de excepciones es aplicable, por lo que es el primer lugar, que se puede generar el evento en el dominio de aplicación donde se originó el subproceso.

System_CAPS_noteNota

En las versiones 1.0 y 1.1 de .NET Framework, este evento se produce solo en el dominio de aplicación predeterminado creado por el sistema cuando se inicia una aplicación. Si una aplicación crea dominios de aplicación adicionales, especificando a un delegado para este evento en dichos dominios de aplicación no tiene ningún efecto.

Si el UnhandledException evento está controlado en el dominio de aplicación predeterminado, se producirá allí para cualquier excepción no controlada en cualquier subproceso, independientemente de qué dominio de aplicación el subproceso inicia. Si se ha iniciado el subproceso en un dominio de aplicación que tiene un controlador de eventos para UnhandledException, se genera el evento 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 desencadena en los dos dominios de aplicación.

Por ejemplo, suponga 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 el UnhandledException se puede generar el evento es "AD1". Si ese dominio de aplicación no es el dominio de aplicación predeterminado, el evento también puede generarse en el dominio de aplicación predeterminado.

System_CAPS_noteNota

Common language runtime suspende las anulaciones del subproceso mientras los controladores de eventos para el UnhandledException eventos se están ejecutando.

Si el controlador de eventos tiene un ReliabilityContractAttribute atributo con las marcas apropiadas, el controlador de eventos se trata como una región de ejecución restringida.

A partir de la .NET Framework 4, este evento no se desencadena para las excepciones que dañan el estado del proceso, como desbordamientos de pila o infracciones de acceso, a menos que el controlador de eventos es crítico para la seguridad y tiene el HandleProcessCorruptedStateExceptionsAttribute atributo.

En las versiones 1.0 y 1.1 de .NET Framework, una excepción no controlada que se produce en un subproceso distinto del subproceso de aplicación principal ha sido detectada por el tiempo de ejecución y, por tanto, no hace que la aplicación finalice. Por lo tanto, es posible que el UnhandledException evento sin la finalización de la aplicación. A partir de la versión 2.0 de .NET Framework, este parada para las excepciones no controladas en subprocesos secundarios se ha quitado, puesto que el efecto acumulado de los errores sin incluido una degradación del rendimiento, datos dañados y bloqueos, todos ellos eran difíciles de depurar. Para obtener más información, incluida una lista de los casos en los que el tiempo de ejecución no finaliza, vea Exceptions in Managed Threads.

Para registrar un controlador de eventos para este evento, debe tener los permisos necesarios, o un SecurityException se produce.

Para obtener más información sobre el control de eventos, vea Controlar y provocar eventos.

Para determinados modelos de aplicación, el UnhandledException evento puede ser adelantado por otros eventos si se produce la excepción no controlada en el subproceso de aplicación principal.

En aplicaciones que usen Windows Forms, no controla las excepciones producidas en la causa de subproceso de aplicación principal el Application.ThreadException evento. Si este evento está controlado, el comportamiento predeterminado es que la excepción no controlada no finaliza la aplicación, aunque la aplicación se queda en un estado desconocido. En ese caso, el UnhandledException no se produce el evento. Este comportamiento se puede cambiar mediante el archivo de configuración de aplicación, o mediante el Application.SetUnhandledExceptionMode método para cambiar el modo que se UnhandledExceptionMode.ThrowException antes de la ThreadException se enlazó el controlador de eventos. Esto se aplica solo al subproceso de la aplicación principal. El UnhandledException evento se desencadena para las excepciones no controladas producidas en otros subprocesos.

A partir de Microsoft Visual Studio 2005, el marco de aplicación de Visual Basic proporciona otro evento para las excepciones no controladas en el subproceso de aplicación principal. Consulte la WindowsFormsApplicationBase.UnhandledException eventos. 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 un ExitApplication propiedad que permite que la aplicación continuar la ejecución, pasando por alto la excepción no controlada (y dejar la aplicación en un estado desconocido). En ese caso, el AppDomain.UnhandledException no se produce el evento.

El siguiente ejemplo se muestra la UnhandledException eventos. Define un controlador de eventos MyHandler, que se invoca cuando se produce una excepción no controlada en el dominio de aplicación predeterminado. A continuación, inicia dos excepciones. La primera se controla mediante un try/catch bloque. El segundo es no controlado y se invoca el MyHandle rutina antes de que finalice la aplicación.

using System;
using System.Security.Permissions;

public class Example 
{
   [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
   public static void Main()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

      try {
         throw new Exception("1");
      } catch (Exception e) {
         Console.WriteLine("Catch clause caught : {0} \n", e.Message);
      }

      throw new Exception("2");
   }

   static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
   {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
   }
}
// The example displays the following output:
//       Catch clause caught : 1
//       
//       MyHandler caught : 2
//       Runtime terminating: True
//       
//       Unhandled Exception: System.Exception: 2
//          at Example.Main()  

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

.NET Framework
Disponible desde 1.1
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Volver al principio
Mostrar: