導入
例外には種類があります。「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を最後に書く - 原因に応じた対応をするために型で絞り込む
次回: 後片付けを保証するfinallyとusingです。