情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

FirstChanceExceptionEventArgs クラス

共通言語ランタイムがイベント ハンドラーの検索を始める前に、マネージ例外が最初に発生したときに発生する通知イベントについてのデータを提供します。

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 オブジェクトが 1 つ含まれています。 最後のアプリケーション ドメインの Worker を除く各 Worker オブジェクトには、次のアプリケーション ドメインの Worker オブジェクトへの参照が含まれています。 FirstChanceException イベントは、Child_1 を除くすべてのアプリケーション ドメインで処理されます。

アプリケーション ドメインが作成されると、既定のアプリケーション ドメインは、最初の子アプリケーション ドメインに対して TestException メソッドを呼び出します。 Worker オブジェクトが次のアプリケーション ドメインに対して TestException メソッドを呼び出していき、最後の Worker が例外をスローして例外が処理されるか未処理となります。 したがって、現在のスレッドはすべてのアプリケーション ドメインを通過し、各アプリケーション ドメインのスタックに TestException が追加されます。

最後の Worker オブジェクトが例外を処理すると、最後のアプリケーション ドメインでのみ FirstChanceException イベントが発生します。 他のアプリケーション ドメインには例外を処理する機会がないため、このイベントは発生しません。

最後の Worker オブジェクトが例外を処理しない場合、イベント ハンドラーを持つ各アプリケーション ドメインで FirstChanceException イベントが発生します。 各イベント ハンドラーが完了すると、既定のアプリケーション ドメインで例外がキャッチされるまで、スタックがアンワインドされます。

メモメモ

イベントの発生場所が既定のアプリケーション ドメインに近づくにつれてスタックの表示がどのように増加するかを調べるには、FirstChanceHandler のイベント ハンドラーの e.Exception.Messagee.Exception に変更します。 TestException がアプリケーション ドメインの境界を越えて呼び出される場合は、2 回 (プロキシ用に 1 回とスタブ用に 1 回) 表示されます。


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