Исключения в управляемых потокахExceptions in Managed Threads

Начиная с .NET Framework версии 2.0, среда CLR позволяет большинству необработанных исключений выполняться в потоках.Starting with the .NET Framework version 2.0, the common language runtime allows most unhandled exceptions in threads to proceed naturally. Как правило, это означает, что необработанное исключение будет вызывать завершение работы приложения.In most cases this means that the unhandled exception causes the application to terminate.

Примечание

Это значительное изменение по сравнению с .NET Framework 1.0 и 1.1, в которых поддерживались многие необработанные исключения, например необработанные исключения в потоках из пула потоков.This is a significant change from the .NET Framework versions 1.0 and 1.1, which provide a backstop for many unhandled exceptions — for example, unhandled exceptions in thread pool threads. См. Отличия от предыдущих версий ниже в этом разделе.See Change from Previous Versions later in this topic.

Среда CLR предоставляет поддержку для определенных необработанных исключений, которые используются для управления потоком выполнения программы:The common language runtime provides a backstop for certain unhandled exceptions that are used for controlling program flow:

  • В потоке создается исключение ThreadAbortException из-за вызова Abort.A ThreadAbortException is thrown in a thread because Abort was called.

  • В потоке создается исключение AppDomainUnloadedException из-за того, что в данный момент выгружается домен приложения, в котором выполняется поток.An AppDomainUnloadedException is thrown in a thread because the application domain in which the thread is executing is being unloaded.

  • Среда CLR или ведущий процесс прерывает выполнение потока путем создания внутреннего исключения.The common language runtime or a host process terminates the thread by throwing an internal exception.

Если любые из этих исключений не обрабатываются в потоках, созданных в среде CLR, исключение завершает поток, однако среда CLR не позволяет исключению выполнять какие-либо дополнительные действия.If any of these exceptions are unhandled in threads created by the common language runtime, the exception terminates the thread, but the common language runtime does not allow the exception to proceed further.

Если эти исключения не обрабатываются в главном потоке или в потоках, которые перешли в среду выполнения из неуправляемого кода, они продолжают выполнение, что приводит к завершению работы приложения.If these exceptions are unhandled in the main thread, or in threads that entered the runtime from unmanaged code, they proceed normally, resulting in termination of the application.

Примечание

Среда выполнения может создать необработанное исключение до того, как любой управляемый код сможет установить обработчик исключения.It is possible for the runtime to throw an unhandled exception before any managed code has had a chance to install an exception handler. Даже если управляемый код не в состоянии обработать такое исключение, исключение может продолжать выполняться.Even though managed code had no chance to handle such an exception, the exception is allowed to proceed naturally.

Создание проблем при работе с потоками во время разработкиExposing Threading Problems During Development

Если потоки могут завершаться сбоем без уведомления и без завершения работы приложения, при программировании могут оставаться незамеченными серьезные ошибки.When threads are allowed to fail silently, without terminating the application, serious programming problems can go undetected. Это создает серьезную проблему для служб и других приложений, которые выполняются продолжительное время.This is a particular problem for services and other applications which run for extended periods. В случае сбоя потоков состояние программы постепенно нарушается.As threads fail, program state gradually becomes corrupted. Производительность приложения может ухудшаться, или приложение может перестать отвечать на запросы.Application performance may degrade, or the application might become unresponsive.

Предоставление возможности необработанным исключениям продолжать выполняться в потоках, пока операционная система не завершит программу, создает проблемы во время разработки и тестирования.Allowing unhandled exceptions in threads to proceed naturally, until the operating system terminates the program, exposes such problems during development and testing. Отчеты об ошибках при завершении программы поддерживают процесс отладки.Error reports on program terminations support debugging.

Отличия от предыдущих версийChange from Previous Versions

Наиболее существенное изменение связано с управляемыми потоками.The most significant change pertains to managed threads. В .NET Framework версий 1.0 и 1.1 среда CLR обеспечивает поддержку для необработанных исключений в следующих ситуациях.In the .NET Framework versions 1.0 and 1.1, the common language runtime provides a backstop for unhandled exceptions in the following situations:

  • В потоке пула потоков необработанные исключения больше не могут существовать.There is no such thing as an unhandled exception on a thread pool thread. Если задача создает исключение, которое остается необработанным, среда выполнения отображает трассировку стека исключений на консоли, а затем возвращает поток в пул потоков.When a task throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then returns the thread to the thread pool.

  • В потоке, созданном методом Start класса Thread, необработанные исключения не могут существовать.There is no such thing as an unhandled exception on a thread created with the Start method of the Thread class. Если код, выполняемый в таком потоке, создает исключение, которое остается необработанным, среда выполнения отображает трассировку стека исключений на консоли и корректно завершает поток.When code running on such a thread throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then gracefully terminates the thread.

  • В потоке метода завершения необработанные исключения больше не могут существовать.There is no such thing as an unhandled exception on the finalizer thread. Если метод завершения создает исключение, которое остается необработанным, среда выполнения отображает трассировку стека исключений на консоли и позволяет потоку метода завершения продолжить выполнение работающих методов завершения.When a finalizer throws an exception that it does not handle, the runtime prints the exception stack trace to the console and then allows the finalizer thread to resume running finalizers.

Основное или фоновое состояние управляемого потока не влияет на такое поведение.The foreground or background status of a managed thread does not affect this behavior.

Для необработанных исключений в потоках, происходящих в неуправляемом коде, существует не такая заметная разница.For unhandled exceptions on threads originating in unmanaged code, the difference is more subtle. Диалог с JIT-присоединением среды выполнения выгружает диалог операционной системы для управляемых или собственных исключений в потоках, которые прошли через машинный код.The runtime JIT-attach dialog preempts the operating system dialog for managed exceptions or native exceptions on threads that have passed through native code. Процесс завершается во всех случаях.The process terminates in all cases.

Перенос кодаMigrating Code

В общем случае изменение позволит выявлять проблемы при программировании, которые ранее обнаруживать не удавалось, для их последующего устранения.In general, the change will expose previously unrecognized programming problems so that they can be fixed. Однако в некоторых случаях программисты могут использовать возможность поддержки среды выполнения, например для завершения потоков.In some cases, however, programmers might have taken advantage of the runtime backstop, for example to terminate threads. В зависимости от ситуации они должны использовать одну из следующих стратегий миграции.Depending on the situation, they should consider one of the following migration strategies:

  • Реструктурируйте код, чтобы при получении сигнала поток корректно выполнял выход.Restructure the code so the thread exits gracefully when a signal is received.

  • Использование метода Thread.Abort для отмены потока.Use the Thread.Abort method to abort the thread.

  • Если поток необходимо остановить, чтобы было можно продолжить завершение процесса, сделайте поток фоновым, чтобы он автоматически завершался при выходе процесса.If a thread must be stopped so that process termination can proceed, make the thread a background thread so that it is automatically terminated on process exit.

Во всех случаях стратегия должна соответствовать правилам разработки исключений.In all cases, the strategy should follow the design guidelines for exceptions. См. раздел Правила разработки исключений.See Design Guidelines for Exceptions.

Флаг совместимости приложенийApplication Compatibility Flag

В качестве временной меры обеспечения совместимости администраторы могут поместить флаг совместимости в раздел <runtime> файла конфигурации приложения.As a temporary compatibility measure, administrators can place a compatibility flag in the <runtime> section of the application configuration file. Это приведет к возврату среды CLR к поведению версий 1.0 и 1.1.This causes the common language runtime to revert to the behavior of versions 1.0 and 1.1.

<legacyUnhandledExceptionPolicy enabled="1"/>  

Переопределение узлаHost Override

В платформе .NET Framework версии 2.0 неуправляемый узел может использовать интерфейс ICLRPolicyManager в API размещения для переопределения политики необработанных исключений по умолчанию среды CLR.In the .NET Framework version 2.0, an unmanaged host can use the ICLRPolicyManager interface in the Hosting API to override the default unhandled exception policy of the common language runtime. Чтобы задать политику для необработанных исключений, используется функция ICLRPolicyManager::SetUnhandledExceptionPolicy.The ICLRPolicyManager::SetUnhandledExceptionPolicy function is used to set the policy for unhandled exceptions.

См. такжеSee also