.NET Frameworkの例外一覧

例外を投げたいとき、「この場合だとどの例外を投げるのが適切なんだろう?」と悩むことが良くあります。

すぐ出てくるのはArgumentException, ArgumentNullException, FileNotFoundExceptionぐらいで、他はパッと出てこないのでただのExceptionを投げて誤魔化しています。ここでは、自分でプログラム書いていてよく使いそうなのを一覧でまとめておきます。説明はMSDNを参考にしました。

System

ArgumentException
メソッドの引数が変な場合。ArgumentNullExceptionやArgumentOutOfRangeException以外の場合で変な時に使う。
ArgumentNullException
引数がnullの場合。
ArgumentOutOfRangeException
メソッドの許容範囲外の値が引数として渡された場合。
ArithmeticException
算術演算によるエラーの基本クラス。OverflowException, DivideByZeroException, NotFiniteNumberException以外の算術エラーを示したければ使う。
OverflowException
算術演算やキャストでオーバーフローが起きた場合。
DivideByZeroException
0で割ったときのエラー。
NotFiniteNumberException
浮動小数点値が無限大の場合。
ArrayTypeMismatchException
間違った型の要素を配列に格納しようとした場合。
FormatException
引数の書式が仕様に一致していない場合。
IndexOutOfRangeException
配列のインデックスが変な場合。
InvalidCastException
無効なキャストの場合。
InvalidOperationException
引数以外の原因でエラーが起きた場合。
ObjectDisposedException
Dispose済みのオブジェクトで操作が実行される場合。
NotImplementedException
メソッドが未実装の場合。
NotSupportedException
呼び出されたメソッドがサポートされていない場合、または呼び出された機能を備えていないストリームに対して読み取り、シーク、書き込みが試行された場合。
NullReferenceException
nullオブジェクト参照を逆参照しようとした場合。いわゆるぬるぽ
PlatformNotSupportException
特定のプラットフォームで機能が実行されない場合。
TimeoutException
指定したタイムアウト時間が経過した場合。

System.Collections.Generic

KeyNotFoundException
コレクションに該当するキーが無い場合。

System.IO

IOException
IOに関する例外の基本クラス。下に該当するのがあればそちらを優先して使う。
DirectoryNotFoundException
ディレクトリが無い場合。
FileNotFoundException
ファイルが無い場合。
EndOfStreamException
ストリームの末尾を超えて読み込もうとしている場合。

自分で定義

あれ?こうしてみると意外と少ない。いや、もっとあるにはあるのですが、ランタイムから投げられるのが普通で自分が投げるものではないかなあというものが多いので、かなり割愛しました。

これでは足りないということで自分で例外クラスを自作する場合は、ApplicationExceptionExceptionクラスから継承させましょう。適宜メソッドはoverrideします。

かつてはApplicationExceptionから継承させようという話だった気がしますが、どうも方針転換したようです。
http://msdn.microsoft.com/ja-jp/library/system.applicationexception.aspxhttp://msdn.microsoft.com/ja-jp/library/ms229007.aspx

class TerriblePresentationException : Exception 
{
    public Slide Slide { get; private set; }

    public TerriblePresentationException(string message, Slide slide) : base(message)
    {
        this.Slide = slide;
    }
    public override string ToString() 
    {
        return Slide + "は、ひどいスライドです。作り直しましょう。\n\n" + Message;
    }
}

なお、上記の一覧にあるようなシステムに予めある例外クラスは、全てSystemExceptionを継承しています。