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

Улавливание необработанного исключения в отдельных потоках

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

Application.ThreadException 

К сожалению, он не захватывает эти необработанные ошибки в отдельных потоках. Я знаю

AppDomain.CurrentDomain.UnhandledException

Однако, похоже, это закрывает приложение при запуске, где, как и первое, нет.

Есть ли способ справиться с необработанными исключениями в отдельных потоках без закрытия приложения?

4b9b3361

Ответ 1

@Ani уже ответили на ваш вопрос. Хотя я не согласен с тем, что необработанные исключения в потоках должны прерывать приложения. Использование потоков обычно означает, что у вас есть какое-то серверное приложение. Приведение в действие может привести к множеству гневных пользователей.

Я написал небольшую статью о правильной обработке исключений: http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

Вы всегда должны ловить исключения для потоков. Обычно я использую следующий шаблон:

  void ThreadMethod(object state)
  {
      try
      {
          ActualWorkerMethod();
      }
      catch (Exception err)
      {
          _logger.Error("Unhandled exception in thread.", err);
      }
  }

  void ActualWorkerMethod()
  {
      // do something clever
  }

Намного проще найти методы потоков, которые неправильно обрабатывают исключения, перемещая логику в отдельный метод и просто сохраняя блок try/catch в методе потока.

Ответ 2

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

Однако этот код:

void ThreadMethod(object state)
{
    try
    {
        ActualWorkerMethod();
    }
    catch (Exception err)
    {
        _logger.Error("Unhandled exception in thread.", err);
    }
}

void ActualWorkerMethod()
{
    // do something clever
}

можно упростить, используя PostSharp:

[LogExceptions]
void ActualWorkerMethod()
{
    // do something clever
}