CLR завершается, когда поток получает необработанное исключение - PullRequest
5 голосов
/ 30 января 2011

У меня есть фоновые темы в моем приложении. Когда один из потоков получает исключение, которое не обрабатывается, завершается весь CLR.

Это нормальное поведение или ошибка в CLR?

Я ожидаю, что поток завершится, но CLR продолжит работать.

Ответы [ 5 ]

7 голосов
/ 30 января 2011

Поведение по умолчанию в приложениях .NET - выход при возникновении необработанного исключения. Когда исключение остается необработанным, программа находится в неизвестном и, возможно, неустойчивом состоянии. То, что это произошло в фоновом потоке, не означает, что ошибка не повлияет на остальную часть программы. Самый разумный путь для среды выполнения в этой ситуации - выгрузить программу.

Вы можете заглянуть в AppDomain.CurrentDomain.UnhandledException, что позволит вам отлавливать необработанные исключения и реагировать соответствующим образом. Лучшее решение - обернуть ваш поток процедур с try...catch. Но он должен обрабатывать только те исключения, которые он умеет обрабатывать. Делаем это:

void MyThreadProc()
{
    try
    {
        // ... 
    }
    catch
    {
        // handle all exceptions
        // This is a BAD idea
    }
}

Это действительно плохая идея, потому что она может маскировать исключения, которые вы действительно хотите распространить в основную программу.

4 голосов
/ 30 января 2011

Ваше ожидаемое поведение раньше было поведением в 1.1. Обычно это считалось плохой идеей. Когда у вас есть необработанное исключение в каком-либо потоке, ваш процесс может остаться в несогласованном состоянии. Обновления общих данных могут быть применены частично и т. Д. Среда выполнения не располагает информацией для безопасной обработки этого сценария или даже не знает, как вы хотите обработать этот сценарий, поэтому его выбор будет означать прекращение потока и выход из вашей программы в странное состояние. Это может привести к утечке ресурсов, зависаниям, повреждению данных и т. Д. Завершая процесс с необработанным исключением, вы точно знаете, что происходит, процесс завершается.

1 голос
/ 30 января 2011

да, это нормально, и вы можете увидеть этот похожий вопрос для более подробной информации.

1 голос
/ 30 января 2011

Это нормальное поведение CLR начиная с версии 2.0.Вот пост MSDN по этому вопросу.Чтобы избежать прерывания процесса, вы можете использовать что-то вроде

<legacyUnhandledExceptionPolicy enabled="1"/>

, что не рекомендуется.

0 голосов
/ 30 января 2011

Это нормальное поведение. Возможно, вы хотите перехватить исключение, чтобы предотвратить выход приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...