本文へスキップ
BecomeCoder

C#実践コース · 第1章 非同期プログラミング · レッスン5

非同期の例外処理

ブラウザで完結

導入

非同期処理も失敗します(通信エラーなど)。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で受け止められる
  • 同期処理と同じ書き味で例外を扱える
  • 非同期でも失敗前提で書く

次回: 非同期の重大な落とし穴「デッドロック」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。