Nasıl yapılır: İlk Fırsat Özel Durum Bildirimleri Alma

FirstChanceException sınıfının olayıAppDomain, ortak dil çalışma zamanı özel durum işleyicilerini aramaya başlamadan önce bir özel durumun oluştuğuna ilişkin bir bildirim almanıza olanak tanır.

Olay, uygulama etki alanı düzeyinde oluşturulur. Yürütme iş parçacığı birden çok uygulama etki alanından geçebilir, bu nedenle bir uygulama etki alanında işlenmeyen bir özel durum başka bir uygulama etki alanında işlenebilir. Bildirim, bir uygulama etki alanı özel durumu işleyene kadar olay için bir işleyici ekleyen her uygulama etki alanında gerçekleşir.

Bu makaledeki yordamlar ve örnekler, tek bir uygulama etki alanı olan basit bir programda ve oluşturduğunuz bir uygulama etki alanında ilk şans özel durum bildirimlerinin nasıl alınacağını gösterir.

Birkaç uygulama etki alanını kapsayan daha karmaşık bir örnek için olay örneğine FirstChanceException bakın.

Varsayılan Uygulama Etki Alanında Birinci Şans Özel Durum Bildirimleri Alma

Aşağıdaki yordamda, uygulamanın giriş noktası olan Main() yöntemi varsayılan uygulama etki alanında çalışır.

Varsayılan uygulama etki alanında birinci şans özel durum bildirimlerini göstermek için

  1. Lambda işlevini kullanarak olay için FirstChanceException bir olay işleyicisi tanımlayın ve olayına ekleyin. Bu örnekte, olay işleyicisi olayın işlendiği uygulama etki alanının adını ve özel durumun Message özelliğini yazdırır.

    using System;
    using System.Runtime.ExceptionServices;
    
    class Example
    {
        static void Main()
        {
            AppDomain.CurrentDomain.FirstChanceException +=
                (object source, FirstChanceExceptionEventArgs e) =>
                {
                    Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                        AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
                };
    
    Imports System.Runtime.ExceptionServices
    
    Class Example
    
        Shared Sub Main()
    
            AddHandler AppDomain.CurrentDomain.FirstChanceException,
                       Sub(source As Object, e As FirstChanceExceptionEventArgs)
                           Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                                             AppDomain.CurrentDomain.FriendlyName,
                                             e.Exception.Message)
                       End Sub
    
  2. Bir özel durum oluşturup yakalayın. Çalışma zamanı özel durum işleyicisini bulmadan önce olay FirstChanceException oluşturulur ve bir ileti görüntülenir. Bu iletiyi, özel durum işleyicisi tarafından görüntülenen ileti izler.

    try
    {
        throw new ArgumentException("Thrown in " + AppDomain.CurrentDomain.FriendlyName);
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine("ArgumentException caught in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, ex.Message);
    }
    
    Try
        Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)
    
    Catch ex As ArgumentException
    
        Console.WriteLine("ArgumentException caught in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, ex.Message)
    End Try
    
  3. Bir özel durum oluştur, ancak yakalama. Çalışma zamanı bir özel durum işleyicisi aramadan önce olay FirstChanceException oluşturulur ve bir ileti görüntüler. Özel durum işleyicisi olmadığından uygulama sonlandırılır.

            throw new ArgumentException("Thrown in " + AppDomain.CurrentDomain.FriendlyName);
        }
    }
    
            Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)
        End Sub
    End Class
    

    Bu yordamın ilk üç adımında gösterilen kod, eksiksiz bir konsol uygulaması oluşturur. Varsayılan uygulama etki alanının adı .exe dosyasının adından ve uzantısından oluştuğundan, uygulamadan alınan çıkış, .exe dosyasının adına bağlı olarak değişir. Örnek çıktı için aşağıdakilere bakın.

    /* This example produces output similar to the following:
    
    FirstChanceException event raised in Example.exe: Thrown in Example.exe
    ArgumentException caught in Example.exe: Thrown in Example.exe
    FirstChanceException event raised in Example.exe: Thrown in Example.exe
    
    Unhandled Exception: System.ArgumentException: Thrown in Example.exe
       at Example.Main()
     */
    
    ' This example produces output similar to the following:
    '
    'FirstChanceException event raised in Example.exe: Thrown in Example.exe
    'ArgumentException caught in Example.exe: Thrown in Example.exe
    'FirstChanceException event raised in Example.exe: Thrown in Example.exe
    '
    'Unhandled Exception: System.ArgumentException: Thrown in Example.exe
    '   at Example.Main()
    

Başka Bir Uygulama Etki Alanında İlk Şans Özel Durum Bildirimleri Alma

Programınız birden fazla uygulama etki alanı içeriyorsa, hangi uygulama etki alanlarının bildirim alacağını seçebilirsiniz.

Oluşturduğunuz bir uygulama etki alanında ilk şans özel durum bildirimlerini almak için

  1. Olay için bir olay işleyicisi FirstChanceException tanımlayın. Bu örnekte, olayın işlendiği uygulama etki alanının adını ve özel durumun özelliğini yazdıran bir static yöntem (Shared Visual Basic yöntemi Message ) kullanılır.

    static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e)
    {
        Console.WriteLine("FirstChanceException event raised in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
    }
    
    Shared Sub FirstChanceHandler(ByVal source As Object,
                                  ByVal e As FirstChanceExceptionEventArgs)
    
        Console.WriteLine("FirstChanceException event raised in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, e.Exception.Message)
    End Sub
    
  2. Bir uygulama etki alanı oluşturun ve olay işleyicisini FirstChanceException bu uygulama etki alanı için olaya ekleyin. Bu örnekte, uygulama etki alanı olarak adlandırılır AD1.

    AppDomain ad = AppDomain.CreateDomain("AD1");
    ad.FirstChanceException += FirstChanceHandler;
    
    Dim ad As AppDomain = AppDomain.CreateDomain("AD1")
    AddHandler ad.FirstChanceException, AddressOf FirstChanceHandler
    

    Bu olayı varsayılan uygulama etki alanında aynı şekilde işleyebilirsiniz. static Varsayılan uygulama etki alanına başvuru almak için içindeki (Shared Visual Basic'teMain()) AppDomain.CurrentDomain özelliğini kullanın.

Uygulama etki alanında birinci şans özel durum bildirimlerini göstermek için

  1. Önceki yordamda oluşturduğunuz uygulama etki alanında bir Worker nesne oluşturun. Sınıfın Worker genel olması ve bu makalenin sonundaki tam örnekte gösterildiği gibi öğesinden MarshalByRefObjecttüretilmesi gerekir.

    Worker w = (Worker) ad.CreateInstanceAndUnwrap(
                            typeof(Worker).Assembly.FullName, "Worker");
    
    Dim w As Worker = CType(ad.CreateInstanceAndUnwrap(
                                GetType(Worker).Assembly.FullName, "Worker"),
                            Worker)
    
  2. Özel durum oluşturan nesnesinin Worker yöntemini çağırın. Bu örnekte yöntemi Thrower iki kez çağrılır. yöntem bağımsız değişkeni ilk kez yöntemin truekendi özel durumunu yakalamasına neden olur. İkinci kez bağımsız değişkeni olur falseve Main() yöntemi varsayılan uygulama etki alanında özel durumu yakalar.

    // The worker throws an exception and catches it.
    w.Thrower(true);
    
    try
    {
        // The worker throws an exception and doesn't catch it.
        w.Thrower(false);
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine("ArgumentException caught in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, ex.Message);
    }
    
    ' The worker throws an exception and catches it.
    w.Thrower(true)
    
    Try
        ' The worker throws an exception and doesn't catch it.
        w.Thrower(false)
    
    Catch ex As ArgumentException
    
        Console.WriteLine("ArgumentException caught in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, ex.Message)
    End Try
    
  3. Yöntemin Thrower kendi özel durumunu işleyip işlemediğini denetlemek için yöntemine kod yerleştirin.

    if (catchException)
    {
        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);
    }
    
    If catchException
    
        Try
            Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)
    
        Catch ex As ArgumentException
    
            Console.WriteLine("ArgumentException caught in {0}: {1}",
                AppDomain.CurrentDomain.FriendlyName, ex.Message)
        End Try
    Else
    
        Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)
    End If
    

Örnek

Aşağıdaki örnek adlı AD1 bir uygulama etki alanı oluşturur ve uygulama etki alanının FirstChanceException olayına bir olay işleyicisi ekler. Örnek, uygulama etki alanında sınıfının bir örneğini Worker oluşturur ve oluşturan adlı ThrowerArgumentExceptionbir yöntemi çağırır. Bağımsız değişkeninin değerine bağlı olarak, yöntemi özel durumu yakalar veya işleyemiyor.

Thrower yöntemi içinde AD1FirstChanceException her özel durum oluşturduğunuzda, içinde olay oluşturulur AD1ve olay işleyicisi bir ileti görüntüler. Çalışma zamanı daha sonra bir özel durum işleyicisi arar. İlk durumda, özel durum işleyicisi içinde AD1bulunur. İkinci durumda, özel durum içinde AD1işlenmemiştir ve bunun yerine varsayılan uygulama etki alanında yakalanmış olur.

Not

Varsayılan uygulama etki alanının adı yürütülebilir dosyanın adıyla aynıdır.

Varsayılan uygulama etki alanına olay için FirstChanceException bir işleyici eklerseniz, varsayılan uygulama etki alanı özel durumu işlemeden önce olay oluşturulur ve işlenir. Bunu görmek için C# kodunu AppDomain.CurrentDomain.FirstChanceException += FirstChanceException; (Visual Basic'te AddHandler AppDomain.CurrentDomain.FirstChanceException, FirstChanceException) başına Main()ekleyin.

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

class Example
{
    static void Main()
    {
        // To receive first chance notifications of exceptions in
        // an application domain, handle the FirstChanceException
        // event in that application domain.
        AppDomain ad = AppDomain.CreateDomain("AD1");
        ad.FirstChanceException += FirstChanceHandler;

        // Create a worker object in the application domain.
        Worker w = (Worker) ad.CreateInstanceAndUnwrap(
                                typeof(Worker).Assembly.FullName, "Worker");

        // The worker throws an exception and catches it.
        w.Thrower(true);

        try
        {
            // The worker throws an exception and doesn't catch it.
            w.Thrower(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
{
    public void Thrower(bool catchException)
    {
        if (catchException)
        {
            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);
        }
    }
}

/* This example produces output similar to the following:

FirstChanceException event raised in AD1: Thrown in AD1
ArgumentException caught in AD1: Thrown in AD1
FirstChanceException event raised in AD1: Thrown in AD1
ArgumentException caught in Example.exe: Thrown in AD1
 */
Imports System.Reflection
Imports System.Runtime.ExceptionServices

Class Example
    Shared Sub Main()

        ' To receive first chance notifications of exceptions in 
        ' an application domain, handle the FirstChanceException
        ' event in that application domain.
        Dim ad As AppDomain = AppDomain.CreateDomain("AD1")
        AddHandler ad.FirstChanceException, AddressOf FirstChanceHandler


        ' Create a worker object in the application domain.
        Dim w As Worker = CType(ad.CreateInstanceAndUnwrap(
                                    GetType(Worker).Assembly.FullName, "Worker"),
                                Worker)

        ' The worker throws an exception and catches it.
        w.Thrower(true)

        Try
            ' The worker throws an exception and doesn't catch it.
            w.Thrower(false)

        Catch ex As ArgumentException

            Console.WriteLine("ArgumentException caught in {0}: {1}",
                AppDomain.CurrentDomain.FriendlyName, ex.Message)
        End Try
    End Sub

    Shared Sub FirstChanceHandler(ByVal source As Object,
                                  ByVal e As FirstChanceExceptionEventArgs)

        Console.WriteLine("FirstChanceException event raised in {0}: {1}",
            AppDomain.CurrentDomain.FriendlyName, e.Exception.Message)
    End Sub
End Class

Public Class Worker
    Inherits MarshalByRefObject

    Public Sub Thrower(ByVal catchException As Boolean)

        If catchException

            Try
                Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)

            Catch ex As ArgumentException

                Console.WriteLine("ArgumentException caught in {0}: {1}",
                    AppDomain.CurrentDomain.FriendlyName, ex.Message)
            End Try
        Else

            Throw New ArgumentException("Thrown in " & AppDomain.CurrentDomain.FriendlyName)
        End If
    End Sub
End Class

' This example produces output similar to the following:
'
'FirstChanceException event raised in AD1: Thrown in AD1
'ArgumentException caught in AD1: Thrown in AD1
'FirstChanceException event raised in AD1: Thrown in AD1
'ArgumentException caught in Example.exe: Thrown in AD1

Ayrıca bkz.