例外を投げたいとき、「この場合だとどの例外を投げるのが適切なんだろう?」と悩むことが良くあります。
すぐ出てくるのは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を継承しています。