C#の標準例外型の概要と扱い方について解説してきます。
この記事で紹介するクラスはすべてSystem名前空間に属しています。
基本型
ここに属する例外型は主に継承して使用します。
throw
スローしないでください。
他の例外型をスローした方がエラーが明確になります。
catch
キャッチするのは避けましょう。
例外の基本クラスであるため、別で処理するべき例外を握りつぶしてしまう危険があります。
最上位レベルの例外ハンドラー以外でキャッチする場合は再スローします。
Exception
アプリケーション実行中に発生したエラーを表します。
このクラスは、すべての例外の基本クラスです。
主に継承して使用します。
SystemException
ApplicationException
これらのクラスはCLRからスローされる例外とそれ以外の例外を区別するために作られました。
しかし、多くの例外クラスがこのパターンに従わなかったため現在では特に意味のないクラスになっています。*1 ,*2
使用法エラー
主にプログラマーのミスによって発生する例外です。
throw
NullReferenceException、IndexOutOfRangeException、AccessVlolationExceptionは自分でスローしないでください。
これらの例外はプラットフォームがスローするために予約されています。
また、これらの例外をスローすることはメソッドの実装詳細を外部に公開することになります。
catch
これらの例外をキャッチするのが正しいケースはほとんどありません。
キャッチせずにソースコードを修正して対応しましょう。
InvalidOperationException
不正なメソッドやプロパティが呼ばれた場合に、不正の原因がオブジェクトの現在の状態にある場合はこの例外をスローします。
ArgumentException
ArgumentNullException
ArgumentOutOfRageException
不正な引数が渡された場合にスローします。
原因によって使いわけるのが望ましいです。
スローする際はParamNameプロパティに原因となった引数の名前をセットするのを忘れないようにしましょう。
引数がnullの場合はArgumentNullException、
正当な範囲の外の値の場合はArgumentOutOfRangeException、
上記に当てはまらない場合はArgumentExceptionまたは別のArgumentException派生クラスをスローします。
NullReferenceException
アクセスしようとしたオブジェクト参照がnullである場合にスローされます。
IndexOutOfRangeException
配列またはコレクションの範囲外にアクセスしようとした際にスローされます。
AccessVlolationException
保護されたメモリに対して読み取りまたは書き込みを行おうとするとスローされます。
CLR
CLR (共通言語ランタイム) によってスローされる例外です。
throw
これらの例外を自分でスローしてはいけません。
CLRによってのみスローされるべきです。
StackOverFlowException
入れ子になったメソッド呼び出しが多くなりすぎ、実行スタックがオーバーフローした場合にスローされます。
無限ループや無限再起が発生していないか確認しましょう。
OutOfMemoryException
主にメモリが不足している場合にスローされますが
StringBuilderのMaxCapacityを超えた事によってスローされることもあります。*3
ComException
COM メソッドの呼び出しによって、認識されない HRESULT が返された場合にスローされます。
SEHException
構造化例外処理 (SEH) エラーを表します。
ExecutionEngineException
共通言語ランタイムの実行エンジンに内部エラーが発生した場合にスローされます。
その他
OperationCanceledException
TaskCanceledException
非同期メソッドがキャンセルされた場合にスローします。
TaskCanceledExceptionはOperationCanceledExceptionを継承しています。
OperationCanceledExceptionとしてキャッチするのが望ましいです。
FormatException
メソッドに渡された入力文字列が指定された要件を満たしていない場合にスローします。
PlatformNotSupportedException
ある機能が特定のプラットフォームでは実行できない場合にスローします。
参考
*1 NETのクラスライブラリ設計 改訂新版 開発チーム直伝の設計原則、コーディング標準、パターン p.452