よく見る例外の種類と対処法【C# 初心者向け・図解イメージつき】

C#

はじめに

前回は、例外処理の基本についてまとめました。

今回は、
実際によく見る例外の種類をやさしく整理します。

例外は怖いものではなく、
「ここで問題が起きていますよ」と教えてくれるアラームのようなものです。

イメージとしては、こんな感じです。

通常の処理  ─────→ うまくいく
             └────→ 問題発生例外アラーム

アラームが鳴ったときにどう対応するか、
それが例外処理です。

① 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とは何か
  • いつ例外を投げるのか
  • 自分で例外を作る意味

少しだけステップアップした内容に進みます。