66

デバッガーが .NET プロセスにアタッチされている場合、ハンドルされない例外がスローされると、デバッガーは (通常) 停止します。

ただし、これはメソッド内では機能しないようですasync

以前に試したシナリオは、次のコードにリストされています。

class Program
{
    static void Main()
    {
        // Debugger stopps correctly
        Task.Run(() => SyncOp());

        // Debugger doesn't stop
        Task.Run(async () => SyncOp());

        // Debugger doesn't stop
        Task.Run((Func<Task>)AsyncTaskOp);

        // Debugger stops on "Wait()" with "AggregateException"
        Task.Run(() => AsyncTaskOp().Wait());

        // Throws "Exceptions was unhandled by user code" on "await"
        Task.Run(() => AsyncVoidOp());

        Thread.Sleep(2000);
    }

    static void SyncOp()
    {
        throw new Exception("Exception in sync method");
    }

    async static void AsyncVoidOp()
    {
        await AsyncTaskOp();
    }

    async static Task AsyncTaskOp()
    {
        await Task.Delay(300);
        throw new Exception("Exception in async method");
    }
}

何か不足していますか?の例外でデバッガーを中断/停止させるにはどうすればよいAsyncTaskOp()ですか?

4

3 に答える 3

3

誰かがこの問題を回避する方法を見つけたかどうか聞きたいですか? おそらく最新のビジュアルスタジオの設定...?

厄介だが実行可能な解決策(私の場合)は、独自のカスタム例外をスローしてから、Stephen Clearyの答えを変更することでした:

[デバッグ] メニューで、[例外] を選択します (このキーボード ショートカットControl+ Alt+を使用できますE)... [例外] ダイアログで、[共通言語ランタイムの例外] 行の横にある [スロー] ボックスをオンにします。

具体的には、カスタム例外をリストに追加し、「スロー」ボックスにチェックマークを付けます。

例えば:

async static Task AsyncTaskOp()
{
    await Task.Delay(300);
    throw new MyCustomException("Exception in async method");
}
于 2015-07-31T11:19:08.130 に答える