本文へスキップ
BecomeCoder

C#文法コース · 第6章 例外処理とnull安全 · レッスン45

例外の種類と catch の絞り込み

ブラウザで完結

導入

例外には種類があります。「0で割った」「配列の範囲外」「変換失敗」など、それぞれ専用の例外型があり、catchを型ごとに分けると、原因に応じた適切な対応ができます。

図解

flowchart TB
    EX["Exception(すべての例外の親)"] --> A["FormatException<br/>変換失敗"]
    EX --> B["DivideByZeroException<br/>0除算"]
    EX --> C["IndexOutOfRangeException<br/>配列範囲外"]
    EX --> D["その他多数"]

サンプル

string[] items = { "a", "b" };

try
{
    Console.WriteLine(items[5]);   // 範囲外アクセス
}
catch (IndexOutOfRangeException)
{
    Console.WriteLine("配列の範囲外です");   // これが出力される
}
catch (FormatException)
{
    Console.WriteLine("形式が不正です");
}
catch (Exception ex)
{
    // 上のどれにも当てはまらない例外は最後の catch で受ける
    Console.WriteLine($"その他のエラー: {ex.Message}");
}
  • 例外型ごとにcatchを分けられる(IndexOutOfRangeExceptionなど)
  • 具体的な型を上に、Exception(すべての親)を最後に書く
  • 型を絞ることで「何が起きたか」に応じた対応ができる

演習

int a = 10;
int b = 0;

// TODO: a / b を計算し、DivideByZeroException を catch して "0では割れません" と出力してください
___
  • 期待される出力: 0では割れません
ヒント1を見る

try { var x = a / b; } catch (DivideByZeroException) { ... }

ヒント2を見る

try { var x = a / b; } catch (DivideByZeroException) { Console.WriteLine("0では割れません"); }

まとめ

  • 例外には型があり、catchを型ごとに分けられる
  • 具体的な型を先に、Exceptionを最後に書く
  • 原因に応じた対応をするために型で絞り込む

次回: 後片付けを保証するfinallyusingです。

実際に動かしてみよう

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

C# — ブラウザ内で実行

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