【C#】主要な例外型まとめ

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

*2 SystemExceptionとApplicationExceptionは無用の長物

*3 OutOfMemoryException クラス


コメントを残す

メールアドレスが公開されることはありません。