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
と例外処理にとって非常に貴重でした。