AppDomain.UnhandledException AppDomain.UnhandledException AppDomain.UnhandledException AppDomain.UnhandledException Event

Определение

Происходит, если выброшенное исключение остается не перехваченным.Occurs when an exception is not caught.

public:
 virtual event UnhandledExceptionEventHandler ^ UnhandledException;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event UnhandledExceptionEventHandler UnhandledException;
member this.UnhandledException : UnhandledExceptionEventHandler 
Public Custom Event UnhandledException As UnhandledExceptionEventHandler 

Реализации

Атрибуты

Примеры

В следующем примере демонстрируется UnhandledException событие.The following example demonstrates the UnhandledException event. Он определяет обработчик MyHandlerсобытий, который вызывается при каждом возникновении необработанного исключения в домене приложения по умолчанию.It defines an event handler, MyHandler, that is invoked whenever an unhandled exception is thrown in the default application domain. Затем он создает два исключения.It then throws two exceptions. Первый обрабатывается блоком try/catch .The first is handled by a try/catch block. Второй — необработанный и вызывает MyHandle подпрограммы до завершения работы приложения.The second is unhandled and invokes the MyHandle routine before the application terminates.

// 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;
using System.Security.Permissions;

public class Example 
{
   [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
   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()  
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()

Комментарии

Это событие предоставляет уведомление о неперехваченных исключениях.This event provides notification of uncaught exceptions. Он позволяет приложению регистрировать сведения об исключении до того, как системный обработчик по умолчанию сообщит пользователю об исключении и завершит работу приложения.It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application. Если доступны достаточные сведения о состоянии приложения, можно выполнить другие действия, такие как сохранение данных программы для последующего восстановления.If sufficient information about the state of the application is available, other actions may be undertaken - such as saving program data for later recovery. Рекомендуется соблюдать осторожность, так как данные программы могут быть повреждены, если исключения не обрабатываются.Caution is advised, because program data can become corrupted when exceptions are not handled.

Примечание

В .NET Framework версиях 1,0 и 1,1 перед вызовом этого события пользователю сообщается о параметрах завершения и отладки приложения, а не после.In the .NET Framework versions 1.0 and 1.1, application termination and debugging options are reported to the user before this event is raised, rather than after.

Это событие может быть обработано в любом домене приложения.This event can be handled in any application domain. Однако это событие не обязательно возникает в домене приложения, где возникло исключение.However, the event is not necessarily raised in the application domain where the exception occurred. Исключение не обрабатывается, только если весь стек потока был развернут без поиска соответствующего обработчика исключений, поэтому первое место, в котором может быть создано событие, находится в домене приложения, в котором был создан поток.An exception is unhandled only if the entire stack for the thread has been unwound without finding an applicable exception handler, so the first place the event can be raised is in the application domain where the thread originated.

Примечание

В .NET Framework версиях 1,0 и 1,1 это событие возникает только для домена приложения по умолчанию, созданного системой при запуске приложения.In the .NET Framework versions 1.0 and 1.1, this event occurs only for the default application domain that is created by the system when an application is started. Если приложение создает дополнительные домены приложений, то указание делегата для этого события в этих доменах приложений не действует.If an application creates additional application domains, specifying a delegate for this event in those applications domains has no effect.

UnhandledException Если событие обрабатывается в домене приложения по умолчанию, оно вызывается для любого необработанного исключения в любом потоке независимо от домена приложения, в котором запущен поток.If the UnhandledException event is handled in the default application domain, it is raised there for any unhandled exception in any thread, no matter what application domain the thread started in. Если поток запущен в домене приложения с обработчиком событий для UnhandledException, событие возникает в этом домене приложения.If the thread started in an application domain that has an event handler for UnhandledException, the event is raised in that application domain. Если этот домен приложения не является доменом приложения по умолчанию и в домене приложения по умолчанию есть обработчик событий, событие возникает в обоих доменах приложений.If that application domain is not the default application domain, and there is also an event handler in the default application domain, the event is raised in both application domains.

Например, предположим, что поток начинается в домене приложения "AD1", вызывает метод в домене приложения "AD2" и вызывает метод в домене приложения "AD3", где он создает исключение.For example, suppose a thread starts in application domain "AD1", calls a method in application domain "AD2", and from there calls a method in application domain "AD3", where it throws an exception. Первым доменом приложения, в котором UnhandledException может быть вызвано событие, является «AD1».The first application domain in which the UnhandledException event can be raised is "AD1". Если этот домен приложения не является доменом приложения по умолчанию, это событие также может возникнуть в домене приложения по умолчанию.If that application domain is not the default application domain, the event can also be raised in the default application domain.

Примечание

Среда CLR приостанавливает прерывания потока, пока выполняются обработчики событий для UnhandledException события.The common language runtime suspends thread aborts while event handlers for the UnhandledException event are executing.

Если обработчик событий имеет ReliabilityContractAttribute атрибут с соответствующими флагами, обработчик событий обрабатывается как область ограниченного выполнения.If the event handler has a ReliabilityContractAttribute attribute with the appropriate flags, the event handler is treated as a constrained execution region.

Начиная с .NET Framework 4.NET Framework 4, это событие не вызывается для исключений, которые повреждают состояние процесса, например, переполняет стек или нарушения прав доступа, если только обработчик событий не является критически важным для безопасности и HandleProcessCorruptedStateExceptionsAttribute имеет атрибут.Starting with the .NET Framework 4.NET Framework 4, this event is not raised for exceptions that corrupt the state of the process, such as stack overflows or access violations, unless the event handler is security-critical and has the HandleProcessCorruptedStateExceptionsAttribute attribute.

В .NET Framework версиях 1,0 и 1,1 необработанное исключение, возникающее в потоке, отличном от основного потока приложения, перехватывается средой выполнения и, следовательно, не приводит к завершению работы приложения.In the .NET Framework versions 1.0 and 1.1, an unhandled exception that occurs in a thread other than the main application thread is caught by the runtime and therefore does not cause the application to terminate. Таким же UnhandledException , событие может быть вызвано без завершения работы приложения.Thus, it is possible for the UnhandledException event to be raised without the application terminating. Начиная с .NET Framework версии 2,0 эта позиция необработанных исключений в дочерних потоках была удалена, так как в совокупной эффективности такие сбои, включая снижение производительности, повреждение данных и зависаний, все, что было сложно см.Starting with the .NET Framework version 2.0, this backstop for unhandled exceptions in child threads was removed, because the cumulative effect of such silent failures included performance degradation, corrupted data, and lockups, all of which were difficult to debug. Дополнительные сведения, в том числе список случаев, когда среда выполнения не завершает работу, см. в разделе исключения в управляемых потоках.For more information, including a list of cases in which the runtime does not terminate, see Exceptions in Managed Threads.

Чтобы зарегистрировать обработчик событий для этого события, необходимо иметь необходимые разрешения или SecurityException исключение.To register an event handler for this event, you must have the required permissions, or a SecurityException is thrown.

Дополнительные сведения об обработке событий см. в разделе обработка и вызов событий.For more information about handling events, see Handling and Raising Events.

Другие события для необработанных исключенийOther Events for Unhandled Exceptions

Для некоторых моделей приложений UnhandledException событие может быть вытеснено другими событиями, если необработанное исключение возникает в основном потоке приложения.For certain application models, the UnhandledException event can be preempted by other events if the unhandled exception occurs in the main application thread.

В приложениях, использующих Windows Forms, необработанные исключения в основном потоке приложения Application.ThreadException приводят к возникновению события.In applications that use Windows Forms, unhandled exceptions in the main application thread cause the Application.ThreadException event to be raised. Если это событие обрабатывается, поведение по умолчанию заключается в том, что необработанное исключение не завершает работу приложения, хотя приложение остается в неизвестном состоянии.If this event is handled, the default behavior is that the unhandled exception does not terminate the application, although the application is left in an unknown state. В этом случае UnhandledException событие не возникает.In that case, the UnhandledException event is not raised. Это поведение можно изменить с помощью файла конфигурации приложения или с помощью Application.SetUnhandledExceptionMode метода, чтобы изменить UnhandledExceptionMode.ThrowException режим ThreadException до подключения обработчика событий.This behavior can be changed by using the application configuration file, or by using the Application.SetUnhandledExceptionMode method to change the mode to UnhandledExceptionMode.ThrowException before the ThreadException event handler is hooked up. Это относится только к основному потоку приложения.This applies only to the main application thread. UnhandledException Событие вызывается для необработанных исключений, вызванных в других потоках.The UnhandledException event is raised for unhandled exceptions thrown in other threads.

Начиная с Microsoft Visual Studio 2005 платформа приложений Visual Basic предоставляет еще одно событие для необработанных исключений в основном потоке приложения.Starting with Microsoft Visual Studio 2005, the Visual Basic application framework provides another event for unhandled exceptions in the main application thread. См. WindowsFormsApplicationBase.UnhandledException событие.See the WindowsFormsApplicationBase.UnhandledException event. Это событие содержит объект аргументов события с тем же именем, что и объект аргументов события AppDomain.UnhandledException, используемый, но с разными свойствами.This event has an event arguments object with the same name as the event arguments object used by AppDomain.UnhandledException, but with different properties. В частности, этот объект аргументов события имеет ExitApplication свойство, позволяющее продолжить выполнение приложения, игнорируя необработанное исключение (и продолжая работу приложения в неизвестном состоянии).In particular, this event arguments object has an ExitApplication property that allows the application to continue running, ignoring the unhandled exception (and leaving the application in an unknown state). В этом случае AppDomain.UnhandledException событие не возникает.In that case, the AppDomain.UnhandledException event is not raised.

Безопасность

SecurityCriticalAttribute
требуется полное доверие для немедленного вызывающего объекта.requires full trust for the immediate caller. Этот член не может использоваться частично доверенным или прозрачным кодом.This member cannot be used by partially trusted or transparent code.

Применяется к