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
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
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
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
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
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
Önceki yordamda oluşturduğunuz uygulama etki alanında bir
Worker
nesne oluşturun. SınıfınWorker
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)
Özel durum oluşturan nesnesinin
Worker
yöntemini çağırın. Bu örnekte yöntemiThrower
iki kez çağrılır. yöntem bağımsız değişkeni ilk kez yöntemintrue
kendi özel durumunu yakalamasına neden olur. İkinci kez bağımsız değişkeni olurfalse
veMain()
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
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ı Thrower
ArgumentExceptionbir 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 AD1
FirstChanceException her özel durum oluşturduğunuzda, içinde olay oluşturulur AD1
ve 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 AD1
bulunur. İkinci durumda, özel durum içinde AD1
iş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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin