5

await基本的に、C#で、キーワードを介して待機している非同期メソッドからの例外をどのようにキャッチする必要があるのか​​疑問に思っています。たとえば、次の小さなコンソールプログラムについて考えてみます。このプログラムには、。というメソッドが含まれていAwaitSyncます。AwaitSyncを呼び出しますTestAsync。これは、実行時に例外をスローするタスクを返します。で例外をキャッチしようとしましたがAwaitAsync処理されません。

class Program
{
    static void Main(string[] args)
    {
        AwaitAsync();
        Console.ReadKey();
    }

    static async Task AwaitAsync()
    {
        try
        {
            await TestAsync();
        }
        catch (Exception)
        {
            Console.WriteLine("Exception caught");
        }
    }

    static Task TestAsync()
    {
        return Task.Factory.StartNew(() => { throw new Exception("Test"); });
    }
}

によって返されたタスクからの例外をキャッチするにはどうすればよいですTestAsyncか?この例はコンソールプログラムですが、私の実際の問題はASP.NET MVC /WebAPIのコンテキスト内にあります。

編集: 技術的な理由で、ターミナルが閉じる前に「例外がキャッチされました」というメッセージに気づかなかったため、例外がキャッチされていることがわかりました。いずれにせよ、Jon Skeetの答えは、私の理解awaitと例外処理にとって非常に貴重でした。

4

1 に答える 1

10

式用に生成されたコードは、によって返されたに関連付けられたawaitを呼び出します。GetResult()TaskAwaiterTaskTestAsync

GetResultタスクが失敗したことに気づき、タスク内から最初の例外をフェッチして、それをスローします。AggregateException

最終的な結果として、catchブロックはタスクでスローされた例外をキャッチしますが、複数の例外があるタスクを待機している場合は、特別なアクションを実行しない限り、最初の例外のみが表示されます(これにはさまざまなアプローチがあります)。

あなたが例外が実際に処理されないと主張しているので、あなたが示しているもの以外の何かがあなたのコードにあるようです-あなたが与えたコードは確かに機能するはずであり、私のために機能します。

于 2012-11-07T09:51:48.003 に答える