AppDomain.UnhandledException Olay
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bir özel durum yakalanmadığında gerçekleşir.
public:
event UnhandledExceptionEventHandler ^ UnhandledException;
public:
virtual event UnhandledExceptionEventHandler ^ UnhandledException;
public event UnhandledExceptionEventHandler? UnhandledException;
public event UnhandledExceptionEventHandler UnhandledException;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event UnhandledExceptionEventHandler UnhandledException;
member this.UnhandledException : UnhandledExceptionEventHandler
[<add: System.Security.SecurityCritical>]
[<remove: System.Security.SecurityCritical>]
member this.UnhandledException : UnhandledExceptionEventHandler
Public Custom Event UnhandledException As UnhandledExceptionEventHandler
Olay Türü
Uygulamalar
- Öznitelikler
Örnekler
Aşağıdaki örnekte olayı gösterilmektedir UnhandledException . Varsayılan uygulama etki alanında işlenmeyen bir özel durum oluşturulduğunda çağrılan bir olay işleyicisi MyHandler
tanımlar. Ardından iki özel durum oluşturur. İlki bir try/catch bloğu tarafından işlenir. İkincisi işlenmemiştir ve uygulama sonlandırılmadan önce yordamı çağırır MyHandle
.
// The example should be compiled with the /clr:pure compiler option.
using namespace System;
using namespace System::Security::Permissions;
public ref class Example
{
private:
static void MyHandler(Object^ sender, UnhandledExceptionEventArgs^ args)
{
Exception^ e = dynamic_cast<Exception^>(args->ExceptionObject);
Console::WriteLine( "MyHandler caught : {0}", e->Message );
Console::WriteLine("Runtime terminating: {0}", args->IsTerminating);
}
public:
[SecurityPermissionAttribute( SecurityAction::Demand, ControlAppDomain = true )]
static void Main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
currentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(Example::MyHandler);
try
{
throw gcnew Exception("1");
}
catch (Exception^ e)
{
Console::WriteLine( "Catch clause caught : {0}\n", e->Message );
}
throw gcnew Exception("2");
}
};
void main()
{
Example::Main();
}
// The example displays the following output:
// Catch clause caught : 1
//
// MyHandler caught : 2
// Runtime terminating: True
//
// Unhandled Exception: System.Exception: 2
// at Example.Main()
// at mainCRTStartup(String[] arguments)
using System;
public class Example
{
public static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
try {
throw new Exception("1");
} catch (Exception e) {
Console.WriteLine("Catch clause caught : {0} \n", e.Message);
}
throw new Exception("2");
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception) args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
}
}
// The example displays the following output:
// Catch clause caught : 1
//
// MyHandler caught : 2
// Runtime terminating: True
//
// Unhandled Exception: System.Exception: 2
// at Example.Main()
open System
open System.Security.Permissions
let myHandler _ (args: UnhandledExceptionEventArgs) =
let e = args.ExceptionObject :?> Exception
printfn $"MyHandler caught : {e.Message}"
printfn $"Runtime terminating: {args.IsTerminating}"
[<EntryPoint>]
let main _ =
let currentDomain = AppDomain.CurrentDomain
currentDomain.UnhandledException.AddHandler(UnhandledExceptionEventHandler myHandler)
try
failwith "1"
with e ->
printfn $"Catch clause caught : {e.Message} \n"
failwith "2"
// The example displays the following output:
// Catch clause caught : 1
//
// MyHandler caught : 2
// Runtime terminating: True
//
// Unhandled Exception: System.Exception: 2
// at Example.main()
Module Example
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Try
Throw New Exception("1")
Catch e As Exception
Console.WriteLine("Catch clause caught : " + e.Message)
Console.WriteLine()
End Try
Throw New Exception("2")
End Sub
Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
Console.WriteLine("MyHandler caught : " + e.Message)
Console.WriteLine("Runtime terminating: {0}", args.IsTerminating)
End Sub
End Module
' The example displays the following output:
' Catch clause caught : 1
'
' MyHandler caught : 2
' Runtime terminating: True
'
' Unhandled Exception: System.Exception: 2
' at Example.Main()
Açıklamalar
Bu olay yakalanmayan özel durumların bildirimini sağlar. Sistem varsayılan işleyicisi özel durumu kullanıcıya bildirmeden ve uygulamayı sonlandırmadan önce uygulamanın özel durum hakkındaki bilgileri günlüğe kaydetmesine olanak tanır. Uygulamanın durumu hakkında yeterli bilgi varsa, daha sonra kurtarma için program verilerini kaydetme gibi başka eylemler de yapılabilir. Özel durumlar işlenmediğinde program verileri bozulabileceğinden dikkatli olunması tavsiye edilir.
Not
.NET Framework sürüm 1.0 ve 1.1'de, uygulama sonlandırma ve hata ayıklama seçenekleri kullanıcıya sonradan değil, bu olay tetiklemeden önce bildirilir.
Bu olay herhangi bir uygulama etki alanında işlenebilir. Ancak, olayın özel durumun oluştuğu uygulama etki alanında tetiklenmiş olması gerekmez. Bir özel durum, yalnızca iş parçacığı için yığının tamamı geçerli bir özel durum işleyicisi bulunmaksızın kaldırılmışsa işlenmemiştir, bu nedenle olayın tetiklenebileceği ilk yer iş parçacığının kaynaklandığı uygulama etki alanındadır.
Not
.NET Framework 1.0 ve 1.1 sürümlerinde bu olay yalnızca bir uygulama başlatıldığında sistem tarafından oluşturulan varsayılan uygulama etki alanı için gerçekleşir. Bir uygulama ek uygulama etki alanları oluşturursa, bu uygulama etki alanlarında bu olay için bir temsilci belirtmenin hiçbir etkisi olmaz.
UnhandledException Olay varsayılan uygulama etki alanında işlenirse, iş parçacığı hangi uygulama etki alanında başlatılırsa başlasın, herhangi bir iş parçacığında işlenmeyen özel durumlar için orada tetiklenir. İş parçacığı için UnhandledExceptionolay işleyicisi olan bir uygulama etki alanında başlatıldıysa, olay bu uygulama etki alanında oluşturulur. Bu uygulama etki alanı varsayılan uygulama etki alanı değilse ve varsayılan uygulama etki alanında bir olay işleyicisi de varsa, olay her iki uygulama etki alanında da oluşturulur.
Örneğin, bir iş parçacığının "AD1" uygulama etki alanında başladığını, "AD2" uygulama etki alanındaki bir yöntemi çağırdığı ve oradan "AD3" uygulama etki alanında özel durum oluşturan bir yöntem çağırdığı varsayılarak. Olayın oluşturulabileceği ilk uygulama etki alanı UnhandledException "AD1"dir. Bu uygulama etki alanı varsayılan uygulama etki alanı değilse, olay varsayılan uygulama etki alanında da tetiklenebilir.
Not
Ortak dil çalışma zamanı, olay için UnhandledException olay işleyicileri yürütülürken iş parçacığı durdurmalarını askıya alır.
Olay işleyicisinin uygun bayraklara sahip bir ReliabilityContractAttribute özniteliği varsa, olay işleyicisi kısıtlanmış yürütme bölgesi olarak kabul edilir.
.NET Framework 4'den başlayarak, olay işleyicisi güvenlik açısından kritik olmadığı ve özniteliğine sahip HandleProcessCorruptedStateExceptionsAttribute olmadığı sürece yığın taşması veya erişim ihlalleri gibi işlemin durumunu bozan özel durumlar için bu olay tetiklenmez.
.NET Framework 1.0 ve 1.1 sürümlerinde, ana uygulama iş parçacığı dışında bir iş parçacığında oluşan işlenmemiş bir özel durum çalışma zamanı tarafından yakalandığından uygulamanın sonlandırılmalarına neden olmaz. Bu nedenle, uygulama sonlandırılmadan olayın tetiklenmiş olması mümkündür UnhandledException . .NET Framework sürüm 2.0'dan başlayarak, bu tür sessiz hataların toplu etkisi performans düşüşü, bozuk veriler ve kilitlemeler içerdiğinden, alt iş parçacıklarındaki işlenmeyen özel durumlar için bu backstop kaldırıldı. Bunların hepsi hata ayıklaması zordu. Çalışma zamanının sonlandırılmadığı durumların listesi de dahil olmak üzere daha fazla bilgi için bkz. Yönetilen İş Parçacıklarındaki Özel Durumlar.
Bu olay için bir olay işleyicisi kaydetmek için gerekli izinlere sahip olmanız gerekir veya bir SecurityException oluşturulur.
Olayları işleme hakkında daha fazla bilgi için bkz. Olayları İşleme ve Oluşturma.
İşlenmeyen Özel Durumlara İlişkin Diğer Olaylar
Belirli uygulama modellerinde, işlenmeyen UnhandledException özel durum ana uygulama iş parçacığında gerçekleşirse, olay diğer olaylar tarafından önlenebilir.
Windows Forms kullanan uygulamalarda, ana uygulama iş parçacığındaki işlenmeyen özel durumlar olayın tetiklenmeye neden olurApplication.ThreadException. Bu olay işlenirse, varsayılan davranış, işlenmeyen özel durumun uygulamayı sonlandırmamasıdır, ancak uygulama bilinmeyen bir durumda bırakılır. Bu durumda, UnhandledException olay tetiklenmez. Bu davranış, uygulama yapılandırma dosyası kullanılarak veya olay işleyicisi bağlanmadan önce ThreadException modunu olarak değiştirmek için UnhandledExceptionMode.ThrowException yöntemi kullanılarak Application.SetUnhandledExceptionMode değiştirilebilir. Bu yalnızca ana uygulama iş parçacığı için geçerlidir. Olay UnhandledException , diğer iş parçacıklarında oluşan işlenmeyen özel durumlar için tetiklenir.
Visual Studio 2005 Microsoft başlayarak, Visual Basic uygulama çerçevesi ana uygulama iş parçacığında işlenmeyen özel durumlar için başka bir olay sağlar. WindowsFormsApplicationBase.UnhandledException Olaya bakın. Bu olay, tarafından AppDomain.UnhandledExceptionkullanılan olay bağımsız değişkenleri nesnesiyle aynı ada sahip ancak farklı özelliklere sahip bir olay bağımsız değişkenleri nesnesine sahiptir. Özellikle, bu olay bağımsız değişkenleri nesnesi, işlenmeyen özel durumu yoksayarak (ve uygulamayı bilinmeyen bir durumda bırakarak) uygulamanın çalışmaya devam etmesini sağlayan bir özelliğe sahiptir ExitApplication . Bu durumda, AppDomain.UnhandledException olay tetiklenmez.