Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

AppDomain.FirstChanceException (Evento)

Ocurre cuando se produce una excepción en código administrado, antes de que el runtime busque un controlador de excepciones en la pila de llamadas del dominio de aplicación.

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

public event EventHandler<FirstChanceExceptionEventArgs> FirstChanceException

Este evento es solo una notificación. Administrar este evento no administra la excepción ni afecta al control de excepciones subsiguiente en forma alguna. Una vez generado el evento e invocados los controladores de eventos, Common Language Runtime (CLR) empieza a buscar un controlador para la excepción. FirstChanceException proporciona al dominio de aplicación una primera oportunidad de examinar cualquier excepción administrada.

El evento se puede controlar por cada dominio de aplicación. Si un subproceso atraviesa varios dominios de aplicación ejecutando una llamada, el evento se genera en cada dominio de aplicación que ha registrado un controlador de eventos, antes de que el CLR empiece a buscar un controlador de excepciones correspondiente en ese dominio de aplicación. Una vez controlado el evento, se busca un controlador de excepciones coincidente en ese dominio de aplicación. Si no se encuentra ninguno, el evento se genera en el dominio de aplicación siguiente.

Debe controlar todas las excepciones que se producen en el controlador de eventos para el evento FirstChanceException. De lo contrario se genera FirstChanceException de forma recursiva. Esto podría producir un desbordamiento de pila y la finalización de la aplicación. Recomendamos implementar los controladores de eventos de este evento como regiones de ejecución restringida (CER), para que las excepciones relacionadas con la infraestructura, como el desbordamiento de pila o de memoria insuficiente, no afecten a la máquina virtual mientras se procesa la notificación de excepción.

Este evento no se genera para las excepciones que indican daño del estado del proceso, como infracciones de acceso, a menos que el controlador de eventos sea crítico para la seguridad y tenga el atributo HandleProcessCorruptedStateExceptionsAttribute.

Common Language Runtime suspende las anulaciones del subproceso mientras se controla este evento de notificación.

El siguiente ejemplo crea una serie de dominios de aplicación denominada AD0 a través de AD3, con un objeto Worker en cada dominio de aplicación. Cada objeto Worker tiene una referencia al objeto Worker en el dominio de aplicación siguiente, salvo Worker en el último dominio de aplicación. El evento FirstChanceException se administra en todos los dominios de aplicación excepto AD1.

NotaNota

Además de este ejemplo, que muestra notificaciones de excepciones de primera oportunidad en varios dominios de aplicación, puede encontrar casos de uso simples en Cómo: Recibir notificaciones de excepciones de primera oportunidad.

Cuando se han creado los dominios de aplicación, el dominio de aplicación predeterminado llama al método TestException para el primer dominio de aplicación. Cada objeto Worker llama al método TestException para el siguiente dominio de aplicación, hasta que el último objeto Worker produce una excepción que es controlada o no. Así, el subproceso actual atraviesa todos los dominios de aplicación y TestException se agrega a la pila en cada dominio de aplicación.

Cuando el último objeto Worker administra la excepción, el evento FirstChanceException solo se genera en el último dominio de aplicación. Los otros dominios de aplicación nunca tienen la oportunidad de administrar la excepción, de modo que no se genera el evento.

Cuando el último objeto Worker no administra la excepción, el evento FirstChanceException se genera en cada dominio de aplicación que tiene un controlador de eventos. Después de que cada controlador de eventos haya finalizado, la pila continúa desenredándose hasta que el dominio de aplicación predeterminado detecte la excepción.

NotaNota

Para ver cómo crece la presentación de la pila cuando el evento se genera cada vez más cerca del dominio de aplicación predeterminado, cambie e.Exception.Message a e.Exception en los controladores de eventos FirstChanceHandler. Observe que cuando se llama a TestException entre los límites de dominio de aplicación, este aparece dos veces: una vez para el proxy y otra vez para el código auxiliar.


using System;
using System.Reflection;
using System.Runtime.ExceptionServices;

class Example
{
    static void Main()
    {
        AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler;

        // Create a set of application domains, with a Worker object in each one.
        // Each Worker object creates the next application domain.
        AppDomain ad = AppDomain.CreateDomain("AD0");
        Worker w = (Worker) ad.CreateInstanceAndUnwrap(
                                Assembly.GetExecutingAssembly().FullName, "Worker");
        w.Initialize(0, 3);

        Console.WriteLine("\r\nThe last application domain throws an exception and catches it:");
        Console.WriteLine();
        w.TestException(true);

        try
        {
            Console.WriteLine(
                "\r\nThe last application domain throws an exception and does not catch it:");
            Console.WriteLine();
            w.TestException(false);
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine("ArgumentException caught in {0}: {1}", 
                AppDomain.CurrentDomain.FriendlyName, ex.Message);
        }
    }

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

public class Worker : MarshalByRefObject
{
    private AppDomain ad = null;
    private Worker w = null;

    public void Initialize(int count, int max)
    {
        // Handle the FirstChanceException event in all application domains except
        // AD1.
        if (count != 1)
        {
            AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler;
        }

        // Create another application domain, until the maximum is reached.
        // Field w remains null in the last application domain, as a signal
        // to TestException(). 
        if (count < max)
        {
            int next = count + 1;
            ad = AppDomain.CreateDomain("AD" + next);
            w = (Worker) ad.CreateInstanceAndUnwrap(
                             Assembly.GetExecutingAssembly().FullName, "Worker");
            w.Initialize(next, max);
        }
    }

    public void TestException(bool handled)
    {
        // As long as there is another application domain, call TestException() on
        // its Worker object. When the last application domain is reached, throw a
        // handled or unhandled exception.
        if (w != null)
        {
            w.TestException(handled);
        }
        else if (handled)
        {
            try
            {
                throw new ArgumentException("Thrown in " + AppDomain.CurrentDomain.FriendlyName);
            }
            catch (ArgumentException ex)
            {
                Console.WriteLine("ArgumentException caught in {0}: {1}", 
                    AppDomain.CurrentDomain.FriendlyName, ex.Message);
            }
        }
        else
        {
            throw new ArgumentException("Thrown in " + AppDomain.CurrentDomain.FriendlyName);
        }
    }

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

/* This example produces output similar to the following:

The last application domain throws an exception and catches it:

FirstChanceException event raised in AD3: Thrown in AD3
ArgumentException caught in AD3: Thrown in AD3

The last application domain throws an exception and does not catch it:

FirstChanceException event raised in AD3: Thrown in AD3
FirstChanceException event raised in AD2: Thrown in AD3
FirstChanceException event raised in AD0: Thrown in AD3
FirstChanceException event raised in Example.exe: Thrown in AD3
ArgumentException caught in Example.exe: Thrown in AD3
 */


.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Compatible con: 4

  • SecurityCriticalAttribute 

    Requiere plena confianza para el llamador inmediato. Un código de confianza parcial o transparente no puede utilizar este miembro.

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft