はじめに
前回は、例外処理の基本についてまとめました。
今回は、
実際によく見る例外の種類をやさしく整理します。
例外は怖いものではなく、
「ここで問題が起きていますよ」と教えてくれるアラームのようなものです。
イメージとしては、こんな感じです。
通常の処理 ─────→ うまくいく
└────→ 問題発生 → 例外(アラーム)アラームが鳴ったときにどう対応するか、
それが例外処理です。
① NullReferenceException
イメージ
「箱が空なのに、中身を取り出そうとした」状態です。
箱(変数) → 中身なし(null)
↓
中身を使おうとする → エラー例
string text = null;
Console.WriteLine(text.Length);text は空っぽなのに、Length を使おうとしているためエラーになります。
対処法
まずは「中身があるか確認する」。
if (text != null)
{
Console.WriteLine(text.Length);
}または、?. を使う方法もあります。
Console.WriteLine(text?.Length);ポイント:
「これ、nullかもしれない?」と考えるクセをつける。
② FormatException
イメージ
「文字なのに、数字として読もうとした」状態です。
"abc" → 数字として読もうとする → 読めない!例
string input = "abc";
int number = int.Parse(input);“abc” は数字ではないので、変換できません。
対処法
「変換できるか試す」方法を使います。
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できませんでした");
}ポイント:
Parse は「変換する」
TryParse は「変換できるか試す」
初心者のうちは TryParse を覚えておくと安心です。
③ IndexOutOfRangeException
イメージ
「3個しかないのに、5番目を取りに行った」状態です。
[1][2][3]
↑ ここは存在しない例
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[5]);存在しない場所にアクセスしようとするとエラーになります。
対処法
範囲を確認する。
if (index < numbers.Length)
{
Console.WriteLine(numbers[index]);
}ポイント:
「何個あるか?」を意識する。
④ InvalidOperationException
イメージ
「今その操作はできません」という状態です。
例えば、
空のリストから最初の要素を取ろうとした場合。
リスト:空
↓
最初の1件を取る → 取れない例
var item = items.First();items が空だとエラーになります。
対処法
存在チェックをする。
var item = items.FirstOrDefault();
if (item != null)
{
// 処理
}ポイント:
「本当にある?」を確認する。
例外は“赤信号”
例外を交通信号に例えると、
- 青信号 → 正常
- 黄色信号 → 注意
- 赤信号 → 例外(止まって確認)
というイメージです。
赤信号が出たら、
- 無視するのではなく
- 状況を確認して
- 正しく対処する
これが例外処理の考え方です。
まとめ
よく見る例外は意外と限られています。
- Null → 中身がない
- Format → 形式が違う
- Index → 範囲外
- InvalidOperation → 今はできない
名前の意味が分かると、
エラーメッセージも怖くなくなります。
まずは、
- どんなときに起きるか
- どう防ぐか
この2つを覚えるだけで十分です。
次回予告
次は、
例外を“投げる側”の考え方
についてまとめます。
- throwとは何か
- いつ例外を投げるのか
- 自分で例外を作る意味
少しだけステップアップした内容に進みます。
