Подтвердить что ты не робот

Что происходит, когда .NET-поток генерирует исключение?

У нас есть интерфейс IPoller, для которого мы имеем различные реализации. У нас есть процесс, который возьмет IPoller и запустит его в отдельном потоке. Я пытаюсь придумать общий способ предоставления обработки исключений для любых IPollers, которые не делают этого сами.

Мое первоначальное мышление состояло в том, чтобы создать реализацию IPoller, которая будет принимать IPoller и просто предоставить некоторые функции ведения журнала. Вопрос, на который я столкнулся, заключается в том, как я могу обеспечить эту обработку ошибок? Если у меня есть IPoller.Start(), который является целью для Thread, это то, где произойдет исключение? Или есть что-то на самой нити, в которую я могу зацепиться?

4b9b3361

Ответ 1

Что-то вроде:

Thread thread = new Thread(delegate() {
    try
    {
        MyIPoller.Start();
    }
    catch(ThreadAbortException)
    {
    }
    catch(Exception ex)
    {
        //handle
    }
    finally
    {
    }
});

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

Ответ 2

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

Необработанное исключение (в верхней части потока) будет (в версии 2.0) уничтожить ваш процесс. Нехорошо.

то есть. любой метод, который вы передаете Thread.Start (и т.д.), должен иметь try/catch и делать что-то полезное в catch (протоколирование, возможно, изящное завершение работы и т.д.).

Для этого вы можете использовать:

  • статические методы ведения журнала
  • захваченные переменные в делегат (как анонимный метод)
  • выставить свой метод в экземпляре, который уже знает о журнале

Ответ 3

В .NET 4.0+ вы должны использовать Задачи вместо потоков. Вот хорошая статья об обработке исключений в параллельной библиотеке задач

Ответ 4

Посмотрите AppDomain.UnhandledException, это поможет вам хотя бы зарегистрировать те исключения, которые вы не обрабатываете, а в некоторых случаях закрыть "красиво":

Это событие предоставляет уведомление о исключенные исключения. Это позволяет приложение для регистрации информации о исключение перед системой обработчик по умолчанию сообщает об исключении пользователю и завершает выражение. Если достаточная информация о состоянии заявки доступны, другие действия могут быть предпринятые - например, программа сохранения данные для последующего восстановления. осторожность рекомендуется, поскольку данные программы могут становятся поврежденными, когда исключения не обрабатывается.

Ответ 5

Посмотрите

Событие Appdomain.FirstChanceException

Сообщает вам момент возникновения какого-либо исключения, и CLR ищет трассировку стека. Также события args указывают тип исключения. Вы можете считать это центральным местом для ведения журнала.