2016-06-18 12 views
0

私は多くの方法でこの例外処理コードを持つレガシープロジェクトで作業しています。ThreadAbortExceptionの広範な使用

catch(ThreadAbortException e) 
{ 
    ... 
} 

私はプロジェクトThread.Abort()またはThread.Interrupt()の呼び出しではどこにも表示されません。これらのThreadAbortExceptionの処理をすべて削除することは安全ですか、それともそれ以外の方法で呼び出すことができます。

答えて

1

Official docs: "Abortメソッドが呼び出されたときにスローされる例外"あなたがThread.Abortへの呼び出しが全くないことを完全に確信しているならば、それらのcatchブロックを消去するかもしれません。

EDIT:Thread.Abortをスレッドで呼び出す外部アプリケーションのコンテキストでコードが実行されている可能性があるので注意してください。

ThreadAbortExceptionは本当に処理できませんが、CLR自体が実際にスレッドASAPを強制終了するために再スローされるため、実際には処理できません。

"実のところ、ThreadAbortExceptionは特別です。それを処理しても、try/catch/finallyの最後にCLRによって自動的に再スローされます(コメントに記載されているように、 ResetAbortに抑えたが、その時点でコードが腐った魚のようなにおい)」 - 詳細については、この質問を読む。ThreadAbortException

+0

@downvoterなぜあなたはこの回答を落としたのかを説明するのに気をつけますか? – Machinarius

+3

私のdownvoteではなく、ドキュメントに基づいて 'ThreadAbortException'がスローされる唯一の方法は' Thread.Abort'が呼び出されるときです。まず、それは間違っています。 'ThreadAbortException'を' throw'ステートメントで手動でスローすることを妨げるものは何もありません(直接インスタンス化することはできませんが、キャッチして保存できます)。第2に、それは誤解を招く:OPのコードに 'Thread.Abort'への直接呼び出しが含まれていないかもしれないが、OPはMicrosoftのIIS WebサーバーであるThread.Abortを呼び出す外部コードを利用している可能性がある。 – hvd

+1

もちろん、手動でスローすることはできますが、そのようにすることは、例外をスローするために必要な数のTAEインスタンスをCLRにスローさせるThread.Abortを呼び出すのと異なり、IIRC例外をスローする特別なことを意味しません。 。あなたのIISの発言は非常に有効です。 – Machinarius

1

まああれば、特にあなたの質問に答えるには、私はこれらを削除する良くないだろうと言うでしょう例外ハンドラは、問題を解決しようとする開発者によって追加された可能性が最も高いためです。これらのハンドラを追加する理由があったと思いますので、このコードを削除すると、将来的にいくつかのバグが再び表示される可能性があります。

についてThreadAbordExceptionについて:私は、デバッグ中にThread.Abort()メソッドを呼び出すだけでなく(VSのバグかもしれませんが、わかりません)、プログラムがクラッシュするように強制します黙ってだから、そのハンドラの中身に応じて、開発者がそのような問題を解決しようとしている可能性があります。

また、サードパーティのライブラリやWebサービスなどのメソッドを別のスレッドで呼び出すこともできます。そのような例外をスローすることができるかどうかはわかりませんが、考えられるケースが考えられます。

1

プロジェクトがメインスレッドで実行されていて、バックグラウンドワーカースレッドが回転していますか?バックグラウンドスレッドの実行中にメインスレッドが終了すると、バックグラウンドスレッドでThreadAbortedExceptionが発生する可能性があります。

catchステートメントは、実際にバックグラウンドスレッドでエラーが発生しなかったこのシナリオを、他の例外とは異なる方法で処理することができます。

関連する問題