カテゴリ: C# 更新日: 2026/02/10

C#の例外クラス階層を理解しよう!Exception・SystemExceptionの基本をやさしく解説

C#の例外クラス階層(Exception・SystemExceptionなど)を理解しよう
C#の例外クラス階層(Exception・SystemExceptionなど)を理解しよう

先生と生徒の会話形式で理解しよう

生徒

「C#でエラーが出たときに使う例外って、どういう仕組みになっているんですか?」

先生

「良いところに気がつきましたね。C#ではエラーを『例外(Exception)』という特別なオブジェクトで扱います。」

生徒

「でも、その例外っていろいろ種類があるみたいで、どうやって整理されてるんですか?」

先生

「例外クラスには階層構造があって、どのようなエラーかによって分類されています。今日はその仕組みを一緒に学びましょう。」

1. 例外(Exception)とは?

1. 例外(Exception)とは?
1. 例外(Exception)とは?

例外とは、プログラムの実行中に起きる「予期しないエラー」を指します。たとえば、存在しないファイルを開こうとしたり、0で割ったりしたときにエラーが発生します。

これらのエラーは、通常のコードでは対応できないため、C#では例外オブジェクトを使って処理を中断し、エラーメッセージを伝えます。このとき使われるのがExceptionクラスです。

2. C#の例外クラスの階層とは?

2. C#の例外クラスの階層とは?
2. C#の例外クラスの階層とは?

C#の例外クラスは、クラスの継承によって階層構造になっています。もっとも基本になるのがExceptionクラスで、すべての例外はこのクラスをもとに作られています。

代表的な階層構造は以下の通りです。

  • System.Object
  • System.Exception(すべての例外の親)
  •   ├ System.SystemException(.NETの内部エラー)
  •   │ ├ System.NullReferenceException(null参照)
  •   │ ├ System.IndexOutOfRangeException(配列の範囲外)
  •   │ └ System.DivideByZeroException(0での割り算)
  •   └ System.ApplicationException(アプリケーション独自の例外)

このように、Exceptionがすべての基礎になっていて、それを元に.NETが用意した例外や、開発者が作る独自の例外が分類されています。

3. SystemExceptionとは?

3. SystemExceptionとは?
3. SystemExceptionとは?

SystemExceptionは、Exceptionを継承したクラスで、.NETのシステム内部で発生する例外を表します。

たとえば、以下のようなときに発生します:

  • NullReferenceException → nullの変数を使おうとした
  • IndexOutOfRangeException → 配列の範囲外を指定した
  • DivideByZeroException → 数値を0で割った

これらの例外はすべてSystemExceptionの子クラスで、プログラムのバグや入力ミスによって起きることが多いです。

4. ApplicationExceptionとは?

4. ApplicationExceptionとは?
4. ApplicationExceptionとは?

ApplicationExceptionは、Exceptionを継承したもう一つの特別なクラスで、開発者が独自に定義する例外の親として使われることを意図しています。

しかし、実際の開発では、ApplicationExceptionを継承せずに直接Exceptionを使うケースも多く、強制ではありません。

例として、自分でエラー内容を指定した例外を作ることもできます:


public class MyCustomException : Exception
{
    public MyCustomException(string message) : base(message)
    {
    }
}

5. 実際の例で理解しよう

5. 実際の例で理解しよう
5. 実際の例で理解しよう

それでは、例外クラスの使い方を実際のコードで見てみましょう。


using System;

class Program
{
    static void Main()
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            Console.WriteLine(numbers[5]); // 存在しないインデックス
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine("配列の範囲外にアクセスしようとしました!");
            Console.WriteLine("エラー内容:" + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("その他のエラーが発生しました。");
            Console.WriteLine("エラー内容:" + ex.Message);
        }
    }
}

このコードでは、IndexOutOfRangeExceptionが発生し、それに対応するcatchブロックでエラーメッセージを表示します。

実行結果は以下のようになります。


配列の範囲外にアクセスしようとしました!
エラー内容:Index was outside the bounds of the array.

6. 例外クラス階層を知ることのメリット

6. 例外クラス階層を知ることのメリット
6. 例外クラス階層を知ることのメリット

例外クラスの階層を知っておくと、適切な例外を的確に処理できるようになります。たとえば、特定のエラーには特定のcatchを書き、それ以外はExceptionでまとめてキャッチすることができます。

また、独自の例外を定義すれば、自分のプログラムに合ったエラー処理がしやすくなります。例外クラスの継承関係は、C#のオブジェクト指向の重要な考え方でもあるので、基礎をしっかり押さえておきましょう。

まとめ

まとめ
まとめ

ここまで、C#の例外クラス階層について、Exceptionクラスを基点とした継承構造や、SystemExceptionとApplicationExceptionの役割、さらに独自例外の作り方や具体的な例外処理の方法などをひとつずつ整理しながら学んできました。例外処理は、C#を使ったアプリケーションの中でとても重要な要素であり、しっかり理解しておくことでプログラムの信頼性を大きく高めることができます。とくに、例外クラスがどのように階層化されているかを把握することは、エラーへの適切な対処を行うための基礎となります。 プログラムが複雑になるほど、発生するエラーの種類も増えていきますが、例外クラス階層を理解していれば、それぞれのエラーがどこに属しているかを判断しながら、正しい例外処理を書き分けることができます。たとえば、配列の範囲外アクセスがIndexOutOfRangeExceptionに分類されるように、どの例外がどのクラスに属するかを知ることで、状況に応じた対応が自然と身に付きます。 また、例外処理ではcatchブロックの順番も重要です。特定の例外を先にキャッチし、それ以外をExceptionでまとめるという構造を理解しておくと、意図しないエラーの吸収や見落としを防げるようになります。とくに、SystemException は.NET内部で起きる典型的なエラーをまとめており、null参照や0除算など、初心者がつまずきやすいミスが分類されています。こうした例外の特徴を知っておくことで、バグ発生時に原因をすぐに推測し、的確に修正できるようになります。 一方で、ApplicationException はアプリケーション独自の文脈に合わせた例外分類を行うために用意されているものですが、実際には直接Exceptionを継承して独自例外を作るケースも多くあります。その理由や使いどころを知ることも、例外クラス設計をより柔軟に行うために必要な視点です。 開発の場面では、例外を投げるだけではなく「どの例外をいつ投げるべきか」を考える力も求められます。適切に例外を選び、上位のコードへと通知し、必要な場所で確実に処理する。この一連の流れを理解することで、アプリケーション全体の安定性が向上し、予期せぬ動作を防ぐことができます。 そこで、これまでの内容を踏まえたひとつの応用例として、複数の例外を発生させる可能性がある処理を統合し、例外の種類ごとにメッセージを出し分けるサンプルコードを以下に示します。

複数の例外を分類して処理するサンプルコード


using System;
using System.IO;

class Program
{
    static void Main()
    {
        try
        {
            Console.WriteLine("ファイルを読み込みます...");
            string text = File.ReadAllText("data.txt");

            Console.WriteLine("数値計算を行います...");
            int a = 10;
            int b = 0;
            int result = a / b;

            Console.WriteLine("計算結果:" + result);
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("指定されたファイルが見つかりませんでした。");
            Console.WriteLine("詳細:" + ex.Message);
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine("数値を0で割ることはできません。");
            Console.WriteLine("詳細:" + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("予期しないエラーが発生しました。");
            Console.WriteLine("詳細:" + ex.Message);
        }
        finally
        {
            Console.WriteLine("処理を終了します。");
        }
    }
}

このコードでは、ファイル読み込みと数値計算という異なる処理の中に、それぞれ異なる例外が発生する可能性を想定しています。ファイルが存在しない場合にはFileNotFoundException、計算処理で問題が発生した場合にはDivideByZeroExceptionがそれぞれ発生し、最後にExceptionで予期しないエラー全般を受け止めています。 例外ごとにメッセージを変えることで、プログラムを使う側にも原因をわかりやすく伝えることができ、エラー対応もスムーズになります。この考え方は、業務システムやユーザー向けアプリケーションなど、どんな分野のプログラム開発でも有効です。 C#の例外クラス階層は、ただ暗記するのではなく、実際のコードと結びつけながら理解することで本当の力になります。例外処理はプログラムが想定外の状況に置かれたときの安全装置のような役割を持ち、設計の段階でしっかり扱うほど、後のトラブルを防ぐことができます。次にプログラムを書く際は、どの例外が発生しうるのか、どこで捕捉するべきかを意識してみると、理解がより深まるはずです。

先生と生徒の振り返り会話

生徒

「例外クラスの階層がここまで整理されているとは知りませんでした。実際にどんな場面でどの例外が発生するのかがイメージしやすくなりました。」

先生

「その気づきはとても大切ですね。例外の種類を理解していれば、バグの原因を探すときにも役に立ちますし、より適切なエラーメッセージを表示できるようになります。」

生徒

「独自例外を作る方法も勉強になりました。自分のアプリの中で決まった条件を判定するときに使えそうです。」

先生

「その通りです。プログラムの文脈に合わせて例外を作ることで、エラー処理がずっと明確になりますよ。」

生徒

「例外を捕まえる順番も重要だというのは新しい発見でした。特定の例外と、その親であるExceptionをどう並べるかを意識していきたいです。」

先生

「今日学んだことは、どのプロジェクトにも応用できる基礎です。これを覚えておけば、例外処理を書くときに迷いが少なくなりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#の例外とは何ですか?エラーとの違いはありますか?

C#の例外とは、プログラムの実行中に発生する予期しないエラーを特別なオブジェクトで表現する仕組みです。通常のエラーとは異なり、catch文で適切に処理することができます。
カテゴリの一覧へ
新着記事
New1
C#
C#でループの中に条件分岐を書く方法!入れ子制御構造の基本
New2
C#
C#のthrow文の基本!例外を自分で発生させる方法
New3
C#
C#のADO.NETの基礎!SqlConnectionとSqlCommandの使い方を初心者向けに徹底解説
New4
C#
C#の例外クラス階層を理解しよう!Exception・SystemExceptionの基本をやさしく解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.3
Java&Spring記事人気No3
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.4
Java&Spring記事人気No4
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.5
Java&Spring記事人気No5
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
No.6
Java&Spring記事人気No6
COBOL
COBOLの帳票レイアウトを美しく!可読性向上テクニックを徹底解説
No.7
Java&Spring記事人気No7
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.8
Java&Spring記事人気No8
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説