Имеет ли смысл перехватывать ThreadAbortException и не выполнять никаких действий? - PullRequest
11 голосов
/ 11 января 2011
catch (ThreadAbortException)
{ }
catch (Exception ex)
{
    TraceManager.TraceException(ex,
                                (int)ErrorCode.GENERIC_EXCEPTION,
                                ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl);
}

имеет ли смысл даже иметь

catch (ThreadAbortException)
{ }

или это приведет к проглатыванию ThreadAbortException и его потере навсегда?

Ответы [ 5 ]

34 голосов
/ 11 января 2011

ThreadAbortException не может быть пойман "полностью";он будет автоматически переброшен в конце блока catch (см. связанную страницу документации MSDN) , если сначала не будет вызван Thread.ResetAbort.

Итак,единственным разумным блоком catch будет:

catch (ThreadAbortException)
{
    // possibly do something here
    Thread.ResetAbort();
}

Но это действительно злой запах.Вероятно, нет причин делать это, поэтому вы, возможно, захотите переосмыслить свой подход.

Обновление: Существует множество вопросов по SO, связанных с Thread.Abort:

Этот имеет тот же ответ, что я дал здесь. У этого есть ответ, который расширяется словами "никогда не звоните Thread.Abort, если только Ктулху не поднимается" (который я значительно смягчил до "злого запаха").

Естьтакже многие другие.

5 голосов
/ 11 января 2011

ThreadAbortException не может быть пойман таким образом.Он будет автоматически переброшен в конце блока catch, если только вы не вызовете Thread.ResetAbort ();

Наличие блока перехвата, как у вас здесь для ThreadAbortException, позволяет автоматически перебрасывать без перехвата (Exception)блок пытается обработать его.

2 голосов
/ 08 апреля 2015

Вызов Thread.Abort в потоке эффективно устанавливает флаг, который будет вызывать выброс ThreadAbortException в любой момент, когда код не обрабатывает это исключение или связанные блоки finally. Поймать исключение без вызова Thread.ResetAbort() просто приведет к тому, что во время выполнения при следующей возможности появится еще один ThreadAbortException. Однако такое поведение не является полностью бессмысленным, поскольку оно заставит все внутренние блоки finally завершиться до того, как исключение будет видно внешними блоками фильтра исключений. Будет ли это хорошо, зависит от приложения.

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

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

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

Он будет пойман и потерян.На самом деле вы должны ловить только те исключения, с которыми вы можете что-то делать или которые вы регистрируете, а затем перебрасывать (с помощью throw; не бросать new [некоторое исключение];).

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