2011年7月5日火曜日

スローする例外チートシート

.NETには様々な例外があります。
どんな例外があるのかについては、某書籍 なり、ufcppさんのサイトなりを見ていただくとして、ここではどんなときにどんな例外をスローするかを知ってる範囲で挙げていこうと思います。あと、ここでは主にライブラリとかフレームワークとかミドルウェアとか、そのレイヤーの観点で紹介します。アプリケーションは対象外です(赤間さんのblogとかを見ると良いかと)

私見が入っていますが、以下のようにして選ぶといいと思います。

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

0 件のコメント:

コメントを投稿