Исключения в управляемых потоках
В .NET Framework версии 2.0 среда CLR позволяет обычному появлению большинства необработанных исключений в потоках. В большинстве случаев это означает, что необработанное исключение приведет к завершению приложения.
Примечание |
---|
Это значительное изменение по сравнению с .NET Framework версии 1.0 и 1.1, которое предоставляет поддержку для многих необработанных исключений, например для необработанных исключений в потоках пула потоков.См. подраздел Отличия от предыдущих версий далее в этом разделе. |
Среда CLR предоставляет поддержку для определенных необработанных исключений, которые используются для управления выполнением программы:
Исключение ThreadAbortException создается в потоке, потому что была вызвана перегрузка Abort.
Исключение AppDomainUnloadedException создается в потоке, потому что выгружается домен приложения, в котором выполняется поток.
Среда CLR или ведущий процесс завершает поток путем создания внутреннего исключения.
Если любые исключения являются необработанными в потоках, созданных в среде CLR, исключение завершает поток, однако среда CLR не позволяет исключению выполнять какие-либо дополнительные действия.
Если эти исключения не обрабатываются в основном потоке или в потоках, которые перешли в среду выполнения из неуправляемого кода, они продолжают выполнение, что приводит к завершению работы приложения.
Примечание |
---|
Среда выполнения может создавать необрабатываемое исключение до того, как любой управляемый код сможет установить обработчик исключения.Даже если управляемый код не может обработать такое исключение, исключение может продолжить работу. |
Нахождение проблем, связанных с поточностью, во время разработки
Если потоки могут завершаться со сбоем без уведомления и без завершения работы приложения, серьезные ошибки при программировании могут остаться незамеченными. Эта проблема касается служб и других приложений, которые работают в течение продолжительного времени. При сбое потока состояние программы постепенно становится поврежденным. Производительность приложения может снизиться, или приложение может зависнуть.
Разрешение необрабатываемым исключениям в потоках выполнять свои действия до прерывания программы операционной системой, приведет к выявлению таких проблем во время разработки и тестирования. Отчеты об ошибках при прерывании программы поддерживают отладку.
Отличия от предыдущих версий
Самое большое отличие связано с управляемыми потоками. В .NET Framework версии 1.0 и 1.1 среда CLR предоставляет поддержку для необрабатываемых исключений в следующих случаях:
В потоке из пула потоков вообще не существует необрабатываемых исключений. Если задача создает исключение, которое не обрабатывается этой задачей, среда выполнения отображает в консоли трассировку стека исключения и возвращает поток в пул потоков.
В потоке, созданном с помощью метода Start класса Thread необрабатываемые исключения отсутствуют. При выполнении кода в таком потоке создается исключение, которое не обрабатывается этой задачей, среда выполнения отображает в консоли трассировку стека исключения и возвращает поток в пул потоков.
В потоке метода завершения вообще не существует необрабатываемых исключений. При создании исключения методом завершения, которое им не обрабатывается, среда выполнения отображает в консоли трассировку стека исключения и позволяет потоку методов завершения возобновить выполнение методов завершения.
Основное или фоновое состояние управляемого потока не влияет на это поведение.
В необрабатываемых исключениях в потоках, исходящих из неуправляемого кода отличие менее заметно. Диалоговое окно JIT-присоединения во время выполнения предваряет диалоговое окно операционной системы для управляемых исключений или машинных исключений в потоках, которые прошли через машинный код. Процесс прерывается в любых случаях.
Перенос кода
В целом, это изменение выявит ранее неопределяемые проблемы программирования для их скорейшего разрешения. Однако в некоторых случаях программисты могут воспользоваться поддержкой средой выполнения, например для прерывания потоков. В зависимости от ситуации они должны учесть одни из следующих стратегий переноса кода:
Реструктурировать код, чтобы поток корректно завершал работу при получении сигнала.
Использовать метод Thread.Abort для отмены потока.
Если поток должен быть остановлен, чтобы завершилось прерывание процесса, следует сделать поток фоновым потоком, чтобы он автоматически завершался при выходе из процесса.
Во всех случаях стратегия должна придерживаться правилам разработки исключений. См. раздел Правила разработки исключений.
Флаг совместимости приложений
В качестве временной меры обеспечения совместимости администраторы могут поместить флаг совместимости в раздел <runtime> файла конфигурации приложения. Это приведет к возврату средой CLR к поведению версий 1.0 и 1.1.
<legacyUnhandledExceptionPolicy enabled="1"/>
Переопределение основным приложением
В .NET Framework версии 2.0 неуправляемое основное приложение может использовать интерфейс ICLRPolicyManager для переопределения политики необрабатываемых исключений по умолчанию в среде CLR. Функция ICLRPolicyManager::SetUnhandledExceptionPolicy используется для установки политики для необрабатываемых исключений.