信息
您所需的主题如下所示。但此主题未包含在此库中。

FirstChanceExceptionEventArgs 类

.NET Framework 4.5

在公共语言运行时开始搜索事件处理程序之前,为托管异常首次出现时引发的通知事件提供数据。

System.Object
  System.EventArgs
    System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs

命名空间:  System.Runtime.ExceptionServices
程序集:  mscorlib(在 mscorlib.dll 中)

public class FirstChanceExceptionEventArgs : EventArgs

FirstChanceExceptionEventArgs 类型公开以下成员。

  名称说明
公共方法FirstChanceExceptionEventArgs使用指定的异常初始化 FirstChanceExceptionEventArgs 类的新实例。
页首

  名称说明
公共属性Exception与托管代码中引发的异常对应的托管异常对象。
页首

  名称说明
公共方法Equals(Object)确定指定的对象是否等于当前对象。 (继承自 Object。)
受保护的方法Finalize允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法GetHashCode作为默认哈希函数。 (继承自 Object。)
公共方法GetType获取当前实例的 Type (继承自 Object。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (继承自 Object。)
公共方法ToString返回表示当前对象的字符串。 (继承自 Object。)
页首

此类为 AppDomain.FirstChanceException 事件的异常处理程序提供了访问该异常的权限。

下面的示例创建名为 Child_0Child_3 的一组应用程序域,而且每个应用程序域中有一个 Worker 对象。 除了最后一个应用程序域中的 Worker,每个 Worker 对象都具有对下一个应用程序域中的 Worker 对象的引用。 FirstChanceException 事件在 Child_1 之外的所有应用程序域中都要处理。

在创建应用程序域后,默认应用程序域将调用第一个子应用程序域的 TestException 方法。 每个 Worker 对象都为下一个对象调用 TestException 方法,直到最后一个 Worker 引发处理的或未处理的的异常。 因此,当前线程会通过所有应用程序域,并将 TestException 添加到每个应用程序域的堆栈中。

当最后一个 Worker 对象处理异常时,将仅在最后一个应用程序域中引发 FirstChanceException 事件。 其他应用程序域永远没有机会处理此异常,因此不会引发该事件。

当最后一个 Worker 对象不处理异常时,每个具有事件处理程序的应用程序域中都将引发 FirstChanceException 事件。 每个事件处理程序完成后,堆栈将继续展开,直到默认应用程序域捕捉到异常。

说明说明

若要查看随着事件的引发越来越接近默认应用程序域,堆栈显示的增长情况,请在 FirstChanceHandler 事件处理程序中将 e.Exception.Message 更改为 e.Exception 请注意,当跨应用程序域边界调用 TestException 时,它出现两次:一次针对代理,一次针对存根。


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

受以下版本支持:4.5.2、4.5.1、4.5、4

.NET Framework Client Profile

受以下版本支持:4

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(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参阅.NET Framework 系统要求

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

社区附加资源

显示:
© 2014 Microsoft