導入
非同期処理も失敗します(通信エラーなど)。awaitした処理で起きた例外は、通常のtry-catchで受け止められます。同期のときと同じ感覚で書けるのがasync/awaitの利点です。
図解
flowchart TB
T["try { await 通信() }"] --> E{"例外が起きた?"}
E -->|はい| C["catch で受け止める<br/>(await した箇所で捕捉)"]
E -->|いいえ| N["結果を使う"]
サンプル
try
{
await RiskyAsync();
}
catch (Exception ex)
{
Console.WriteLine($"失敗を捕捉: {ex.Message}"); // これが出力される
}
Console.WriteLine("処理は継続");
async Task RiskyAsync()
{
await Task.Delay(30);
throw new Exception("通信エラー"); // 非同期の中で例外
}
awaitした処理で発生した例外は、そのawaitの場所で投げられる- 通常の
try-catchでそのまま受け止められる(同期と同じ書き味) - 非同期でも「失敗を前提に書く」姿勢は変わらない
演習
// TODO: FailAsync を await し、例外を catch して "エラー処理完了" と出力してください
async Task FailAsync() { await Task.Delay(10); throw new Exception("失敗"); }
___
- 期待される出力:
エラー処理完了
ヒント1を見る
try { await FailAsync(); } catch (Exception) { ... }
ヒント2を見る
try { await FailAsync(); } catch (Exception) { Console.WriteLine("エラー処理完了"); }
まとめ
awaitした処理の例外はtry-catchで受け止められる- 同期処理と同じ書き味で例外を扱える
- 非同期でも失敗前提で書く
次回: 非同期の重大な落とし穴「デッドロック」です。