2017-01-23 7 views
0

タスクから例外処理を実装しようとしていますが、それを正しく取得できないようです。私はパターンのいくつかの例を見つけましたが、何を試しても、私はいつもタスク自体から未処理の例外を得るようです。私は何かが欠けているに違いないが、何が見えないのか。どんな助けも非常に高く評価されるでしょう。非同期/未処理の例外をスローすることを待ちます

は、私は、MSDNで見つけ例を試してみたが、それは私のために動作しません:

https://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx

そして、私はこの質問への答えを追ったが、私は、Visual Studioで修正を実行すると、それ

:これは私が最初に書いたコードである

ContinueWith TaskContinuationOptions.OnlyOnFaulted does not seem to catch an exception thrown from a started task

:まだ未処理の例外について不平を言います

static void Main(string[] args) 
{ 
    TestAsync().ContinueWith(t => 
    { 
     Console.WriteLine(t.Exception.ToString()); 
    }, TaskContinuationOptions.OnlyOnFaulted); 

    Console.ReadKey(); 
} 

static async Task<IEnumerable<string>> TestAsync() 
{ 
    IEnumerable<string> list = null; 

    try 
    { 
     list = await TestTask(); 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("Caught!"); 
    } 


    return list; 
} 

static Task<IEnumerable<string>> TestTask() 
{ 
    var task = new Task<IEnumerable<string>>(() => 
    { 
     throw new AggregateException("This is a test"); 
    }); 

    task.Start(); 

    return task; 
} 
+0

私は完全にはっきりしていません - 何が起こると思いますか?私が見るのは、スロー、キャッチ、再スローのパスだけです。それは例外を扱いません。 –

+0

お返事ありがとうございます。私は、TestTask()でスローされた例外が、返されるタスクのExceptionプロパティで終わることを期待していましたが、この例をVisual Studioで実行すると、TestTask()のスローが強調表示され、未処理の例外です。私はMSDNの例も同じことをしていたことに驚いていました。 –

+0

サンプルコードを更新して、私がもう少しやろうとしていることを示しました。 –

答えて

2

VSが壊れた後にちょうどヒットすると、それはあなたのContinueWithに表示されます。デバッガは、実行を処理するコード内でtry/catchを見つけることができないので、デバッガの奇抜なことです。

デバッガを停止してメッセージが表示されないようにするには、デバッガオプションで「Just My Code」を無効にして、Taskの中にあるtry/catchがそのものとしてカウントされるようにする必要があります例外をキャッチします。

+0

うわー - それは本当にすべてですか?私はそれが私のContinueWithに残っていることに気付きました。例外の後も続けますが、コードがリリースで実行されていれば、未処理の例外が発生することになります。 –

+0

助けてくれてありがとう。私はリリースモードで上記のコードをテストし、期待どおりに動作します。より大きなアプリケーションを開発してデバッグモードにする必要があるときは、これはちょっと面倒ですが、「Just My Code」オプションが使用されていると思います。 –

関連する問題