Игнорировать исключение ThreadAbortException при регистрации исключений - PullRequest
1 голос
/ 19 июля 2010

Как правильно игнорировать ThreadAbortException при регистрации исключений?

Безопасно ли просто ловить его в пустом блоке захвата, чтобы он исчез?

Ответы [ 3 ]

1 голос
/ 20 июля 2010

Если вам нужно остановить распространение ThreadAbortException дальше вверх по стеку вызовов, вы можете позвонить Thread.ResetAbort.Поэтому попробуйте что-то вроде:

try
{
  // some code
}
catch (ThreadAbortException ex)
{
  // do some logging
  Thread.ResetAbort();
}

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

0 голосов
/ 07 сентября 2018

Используйте два блока catch: один для ThreadAbortException и один для остальных, например:

void MainLoop()
{   bool workdone;
    try
    {   while( IsWorking ) // cross-thread volatile variable
        {   workdone = Process();
            if( !workdone )
            {   Thread.Sleep( 500 );  }
        }
    }
    catch( ThreadAbortException )
    {   // Forced termination. Exit silently.
    }
    catch (Exception e)
    {   LogError( e );  }
}
0 голосов
/ 19 июля 2010

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

Я оставляю этот пост только из-за комментариев. Очевидно, я мало что знал об этом исключении.

...