2011-01-10 12 views
9
catch (ThreadAbortException) 
{ } 
catch (Exception ex) 
{ 
    TraceManager.TraceException(ex, 
           (int)ErrorCode.GENERIC_EXCEPTION, 
           ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl); 
} 

それもThreadAbortExceptionが飲み込んだと永遠に失われThreadAbortExceptionを捕まえてアクションを実行するのは意味がありますか?

catch (ThreadAbortException) 
{ } 

や意志を持っていることに意味を作るのですか?

+4

ハンドラの完了時に 'ThreadAbortException'が再スローされます。 – Gabe

答えて

29

ThreadAbortException「完全に」捕らえることはできません。 catchブロック(リンクされたMSDNドキュメントのページを参照)の末尾に自動的に再現されます。Thread.ResetAbortが最初に呼び出される場合を除きます。

だから、唯一の賢明なcatchブロックは次のようになります。

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

しかし、これは本当に邪悪な香りを持っています。おそらくそれを行う理由はないので、あなたのアプローチを再考したいかもしれません。

アップデート:私はここに与えているよう

This oneが同じ答えを持っています Thread.AbortとSOその契約上の多くの質問があります。 This oneは、「Cthulhuが立ち上がっていない限りThread.Abortに電話してはいけません」という回答があります(これはかなり「悪臭」です)。

他にも多数あります。

+1

+1:ニットピックアップの言葉。それは捕まえることができます - それはちょうど再投げられるでしょう。 – Hogan

+0

@Hogan:少し言い直してください。今の意味はもっとはっきりしているはずです。 – Jon

+0

非常に良い答え。もし私ができるなら、私はもう一度それを与えるだろう。 – Hogan

4

ThreadAbortExceptionはそれほど捕らえられません。 Thread.ResetAbort()を呼び出さない限り、キャッチブロックの最後に自動的に再スローされます。

ここでThreadAbortExceptionのようにキャッチブロックを使用すると、catch(Exception)ブロックがそれを処理しようとせずに自動的に再スローされます。

-3

これは、キャッチされ、失われます。あなたは本当にあなたが何かをすることができる、あるいはあなたがログしてからスローすることで(スローで新しい;いくつかの例外を投げない;))例外をキャッチしなければなりません。

0

異なる種類の例外に対して特定の処理を実行する場合は、別個のキャッチブロックを持つためです。

+3

私は同意しません。通常、あなたが捕まえているものについて具体的にする方が良いです。tryブロックが投げる可能性のある例外の種類がわからない場合は、アプリケーションに十分なテストを与えていないことを意味します。 –

+0

私はIlyaに同意します。 +1 – Nick

0

スレッドでThread.Abortを呼び出すと、効果的にフラグが設定され、タイムコードがその例外を処理していないか、関連付けられているfinallyブロックのいずれかがスローされます。 Thread.ResetAbort()を呼び出さずに例外をキャッチすると、実行時に次の機会に別のThreadAbortExceptionがスローされます。しかし、そのような振る舞いは完全に無意味ではありません。なぜなら、外側の例外フィルタブロックによって例外が認識される前に、すべての内部ブロックが完了まで実行されるからです。それが良いことであるかどうかは、アプリケーションに依存します。

関連する問題