FirstChanceExceptionEventArgs 类

定义

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

C#
public class FirstChanceExceptionEventArgs : EventArgs
继承
FirstChanceExceptionEventArgs

示例

以下示例通过 Child_3创建一系列名为 Child_0 的应用程序域,每个应用程序域中都有一个 Worker 对象。 每个对象都有 WorkerWorker 下一个应用程序域中的 对象的引用,但最后一个应用程序域中的 除外 Worker 。 事件 FirstChanceException 在除 之外 Child_1的所有应用程序域中进行处理。

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

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

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

备注

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

C#
using System;
using System.Reflection;
using System.Runtime.ExceptionServices;

class FirstChanceExceptionSnippet
{
    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(
                                typeof(Worker).Assembly.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(
                             typeof(Worker).Assembly.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
 */

注解

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

构造函数

FirstChanceExceptionEventArgs(Exception)

使用指定的异常初始化 FirstChanceExceptionEventArgs 类的新实例。

属性

Exception

与托管代码中引发的异常对应的托管异常对象。

方法

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于

产品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

另请参阅