資訊
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

FirstChanceExceptionEventArgs 類別

.NET Framework 4.5

在 Common Language Runtime 開始搜尋事件處理常式之前,為第一次發生 Managed 例外狀況時所引發的通知事件提供相關資料。

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

命名空間:  System.Runtime.ExceptionServices
組件:  mscorlib (在 mscorlib.dll 中)

public class FirstChanceExceptionEventArgs : EventArgs

FirstChanceExceptionEventArgs 類型會公開下列成員。

  名稱描述
公用方法FirstChanceExceptionEventArgs使用指定的例外狀況,初始化 FirstChanceExceptionEventArgs 類別的新執行個體。
回頁首

  名稱描述
公用屬性Exception與 Managed 程式碼所擲回的例外狀況對應的 Managed 例外狀況物件。
回頁首

  名稱描述
公用方法Equals(Object)判斷指定的物件是否等於目前物件。 (繼承自 Object)。
受保護的方法Finalize 允許物件在記憶體回收進行回收之前,嘗試釋放資源並執行其他清除作業。 (繼承自 Object)。
公用方法GetHashCode做為預設雜湊函式。 (繼承自 Object)。
公用方法GetType取得目前執行個體的 Type (繼承自 Object)。
受保護的方法MemberwiseClone建立目前 Object 的淺層複本 (Shallow Copy)。 (繼承自 Object)。
公用方法ToString傳回表示目前物件的字串。 (繼承自 Object)。
回頁首

這個類別會提供 AppDomain.FirstChanceException 事件與存取例外狀況的例外處理常式。

下列範例會建立一系列名為 Child_0Child_3 的應用程式定義域,每個應用程式定義域中會含有一個 Worker 物件。 每個 Worker 物件都有下一個應用程式定義域中 Worker 物件的參考,最後一個應用程式定義域中的 Worker 除外。 FirstChanceException 事件會在 Child_1 以外的所有應用程式定義域中處理。

當應用程式定義域已建立時,預設應用程式定義域會呼叫第一個子應用程式定義域的 TestException 方法。 每個 Worker 物件都會為下一個子應用程式定義域呼叫 TestException,直到最後一個 Worker 擲回已處理或未處理的例外狀況。 因此,目前的執行緒會通過所有的應用程式定義域,且 TestException 會加入至每個應用程式定義域中的堆疊。

當最後的 Worker 物件處理例外狀況時,只會在最後一個應用程式定義域中引發 FirstChanceException 事件。 其他應用程式定義域永遠不會有機會來處理例外狀況,因此不會引發事件。

當最後的 Worker 物件未處理例外狀況時,會在每個具有事件處理常式的應用程式定義域中引發 FirstChanceException 事件。 每個事件處理常式都已完成後,堆疊就會持續回溯,直到預設應用程式定義域捕捉到例外狀況。

注意事項注意事項

若要查看堆疊顯示如何隨著事件引發而愈來愈接近預設的應用程式定義域,請將 e.Exception.Message 變更為 FirstChanceHandler 事件處理常式中的 e.Exception 請注意,跨越應用程式定義域界限TestException 呼叫時,它會出現兩次: 一次 Proxy 和一次 Stub。


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 系統需求

這個類型的任何 Public static (在 Visual Basic 中為 Shared) 成員都是安全執行緒。不保證任何執行個體成員是安全執行緒。

社群新增項目

顯示:
© 2014 Microsoft