2013-02-20 16 views
6

私はthis article on MSDNを研究しましたが、このトピックに関してはまだいくつかの質問/回答がありますが、以下のコードがうまくいかない理由がわかりません(サンプルコンソールアプリ)。デバッガでタスクの例外を処理する方法は?

MSDNによると、helloメッセージの内部例外が1つ含まれるAggregateExceptionがスローされることが予想されます。代わりに、このhello例外は処理されません。これはデバッガの内部で発生します。

[続行]を押すか、スタンドアロンで実行すると、正常に動作します。 VSのすべての時間を続けることを避ける方法はありますか?結局、Try...Catchブロック内にあるものはすべて、と扱われ、単一のスレッドプログラミングモデルでとみなされます。さもなければ、デバッグは悪夢になるかもしれません。

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

C#

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

明らかに何かがあります私はここで行方不明ですか?

+0

はすべての例外で停止するデバッガーを設定します。それはどこで止まるのですか? 'TaskThatThrowsException'と' Wait'で停止する必要があります。 – usr

+0

@usr:今でも 'Throw New Exception(" hello ")'行で停止していても、スローされたすべてをチェックするとそれが改善されません。私はそれを止めず、むしろConsole.WriteLineを処理したいと思います。さもなければ、デバッグは悪夢になるかもしれません。 – Neolisk

+0

タスクの例外はStartNewには表示されず、.Wait()でのみ表示されます。 Dim myTask = Task.Factory.StartNew(...)MyTask.Wait()を試す... – adrianm

答えて

2

"Enable My Code"設定はこれに影響します。 [ツール] - > [オプション] - > [デバッグ] - > [一般] - > [自分のコードだけを有効にする]の順にクリックします。これをオンにした場合、コードで処理できない例外が処理されていないとみなされます。このオプションをオフにしてみてください。

参照: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1を参照してください。この特定のケースでは、このアプローチがMicrosoftによって推奨されるようです。私はこの質問をする前にこの特定のページをすばやく見ていると確信しているので、次回はMSDNをもっと慎重に読んでください。どうもありがとう! – Neolisk

2

これは、Visual Studioのダイアログで何を誤解している可能性が高いためです。

例外は "user unhandled"です。これはキャッチするユーザーコード(元Exception)がないため、TPLによってキャッチされています。したがって、デバッガを続行させる場合、またはデバッガなしでアプリケーションを実行する場合は、期待している動作が表示されます。

+0

+1。通常の例外を除いて、 'Try ... Catch'ブロック内であれば処理されたとみなされます(タイプは対応し、再スローされません)。アプリケーションをデバッグするにはどうすればいいですか?同様のケースでは、常に「続行」を押しますか?デバッグ時にVSがこれらの例外をキャッチしないようにする方法はありますか? – Neolisk

+1

@Neolisk Debug-> Exceptions-> Thcheチェックを外す – Marc

+0

@Marc:Thrownはどこからでもチェックされていません。 – Neolisk

関連する問題