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ştuğunda çağrılan bir olay işleyicisi MyHandlertanı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
Farklı iş parçacıklarından özel durumlar oluşursa işleyiciler birden çok kez çağrılabilir.
Olay, UnhandledException 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. İşleyici, özel durum oluştuğunda tutulan kilitleri tutarken de çalışır, bu nedenle kilitlenmelere neden olabilecek diğer kaynakları beklemekten kaçınmak için dikkatli olunmalıdır.
Bu olay herhangi bir uygulama etki alanında işlenebilir. Ancak, olayın özel durumun oluştuğu uygulama etki alanında tetiklenmiş olması şart değildir. Özel durum, yalnızca iş parçacığı yığınının tamamı geçerli bir özel durum işleyicisi bulunmaksızın kaldırılmışsa işlenmez, bu nedenle olayın oluşturulabileceği ilk yer iş parçacığının kaynaklandığı uygulama etki alanındadır.
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 burada oluşturulur. İş 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 da bir olay işleyicisi 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 burada bir özel durum oluşturan "AD3" uygulama etki alanındaki bir yöntemi ç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 oluşturulabilir.
Note
Ortak dil çalışma zamanı, UnhandledException olayının işleyicileri yürütülürken iş parçacığı iptallerini 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.
Bu olay, 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 tetiklenmez.
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 durumlar için diğer olaylar
Belirli uygulama modellerinde, işlenmeyen UnhandledException özel durum ana uygulama iş parçacığında oluşursa, 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 olur Application.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 değiştirilebilir veya olay işleyicisi bağlanmadan önce modu Application.SetUnhandledExceptionMode olarak değiştirmek için UnhandledExceptionMode.ThrowException yöntemi kullanılabilir. 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 oluşturulur.
Visual Basic uygulama çerçevesi, ana uygulama iş parçacığındaki işlenmeyen özel durumlar için başka bir WindowsFormsApplicationBase.UnhandledException olayı sağlar. Bu etkinlik, AppDomain.UnhandledException tarafından kullanılan olay bağımsız değişkenleri nesnesiyle aynı ada sahip olan, ancak farklı özelliklere sahip bir olay bağımsız değişkenleri nesnesine sahiptir. Özellikle, bu olay bağımsız değişkenler nesnesi, işlenmeyen özel durumu yoksayarak (ve uygulamayı bilinmeyen bir ExitApplication durumda bırakarak) uygulamanın çalışmaya devam etmesini sağlayan bir özelliğe sahiptir. Bu durumda, AppDomain.UnhandledException olay tetiklenmez.