どんな例外があるのかについては、某書籍 なり、ufcppさんのサイトなりを見ていただくとして、ここではどんなときにどんな例外をスローするかを知ってる範囲で挙げていこうと思います。あと、ここでは主にライブラリとかフレームワークとかミドルウェアとか、そのレイヤーの観点で紹介します。アプリケーションは対象外です(赤間さんのblogとかを見ると良いかと)
私見が入っていますが、以下のようにして選ぶといいと思います。
- これ以上続行すると、データ破壊など副作用が起こる。
- Environment.FailFast
- プログラマーにミスはないが、プログラム的に対処できるエラーが発生した。
- 既存の例外で対処できる
- ディクショナリ(やそれに似たデータ構造)で指定したキーに対応する値がない:KeyNotFoundException
- 必要なファイルがない:FileNotFoundException
- など(挙げるときりがないので省略)
- 既存の例外では対処できない
- System.Exceptionから派生した独自例外を作る
- 引数がそれ単独でおかしい。
- nullにできない(または、その引数がnullであることに意味がない。たとえば、必須の引数):ArgumentNullException
- 引数が範囲外(たとえばインデックスが負):ArgumentOutOfRangeException
- 列挙型の引数が、未定義の数値(.NETの場合、列挙型で定義していない数値を列挙型にキャストして渡せるので):InvalidEnumArgumentException、またはArgumentOutOfRangeException
- 実装時点では未知の列挙値に対しては、NotSupportedExceptionというのもあり
- Parseメソッド(やそれに準ずるメソッド)で、引数が形式に合わない(TryParseで本来falseを返すような値):FormatException
- パスがそのプラットフォームでの最大長を超えている:PathTooLongException
- その他:ArgumentException
- Messageプロパティに具体的な理由を入れましょう。
- APIの使い方がおかしい
- そもそもDisposeした後に呼び出すとかおかしいよ:ObjectDisposedException
- その他、引数はあっているけど、呼び出し方がおかしい場合(プロパティの値が矛盾している、必須のプロパティが設定されていないなど):InvalidOperationException
- 何らかの理由で、ある操作を仕様として実行できない
- 具体的には(ランタイムより下にある)プラットフォーム(まぁOS)の都合で実行できない:PlatformNotSupportedException
- その他(指定した列挙値をサポートしていない、継承したメンバーをサポートできない(読み取り専用のコレクションやストリームでの書き込み処理など)):NotSupportedException
- ごめん、まだ実装してない(テストファーストだとか、互換ライブラリを作っていて今回のリリースでは未実装とか)
- NotImplementedException
- それ以外
- 足しますのでご一報ください。
0 件のコメント:
コメントを投稿