2

これは、「C# 5.0 in a Nutshell」のサンプル コードです。

TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew (() =>
{
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw null; }, atp);
})
.ContinueWith (p => Console.WriteLine (p.Exception),
                TaskContinuationOptions.OnlyOnFaulted);

VS2012 設定で「CLR 例外」: 「ユーザー未処理でブレーク」オプションをチェックして、このコードを実行すると、VS の「NRE 例外がユーザー コードによって処理されませんでした」というポップアップが表示されます。throw null;

ContinueWith 以降の Wait で例外を try-catch しようとしましたが、未処理の例外が発生しました。

「CLR例外」を有効にするソリューションのように感じます:「ユーザー未処理のブレーク」をオフにすると、実際にこの例外を処理するため、間違っているようです。では、それを管理する正しい方法は何ですか?

4

1 に答える 1

3

デバッガーが実行を停止する理由は、ユーザー コード (「マイ コード」) 内のハンドラーによって処理されないすべての例外で、「ユーザーが処理しない例外で中断する」が中断するためです。

例外をキャッチする TPL はユーザー コードとは見なされないため、デバッガーは例外がユーザー コードによって処理されないと見なします。

問題は、TPL にはTaskContinuationOptions.OnlyOnFaultedをトリガーする他の方法がないことです。

うまくいけば、例外を取得することは通常の流れの一部ではありません。そうでない場合、デバッガーで例外が未処理として表示されることは、実際には、タスク フローでエラーをデバッグするのに適している場合があります。

于 2013-02-03T08:20:13.467 に答える