たなかこういちの開発ノート

システム開発に携わる筆者が、あれこれアウトプットするブログ

エラーケースのパターン分類〔概念編〕(2/3)

(※前回からの続きです。)
 
■ 「失敗終了」をさらに二つに分類する
 
「失敗終了」は、その要因に基づいてさらに下記の二つに分類します。
 
- 機能要件に係るもの
- 非機能要件に係るもの
 
「失敗終了」は、処理呼び出し側が呼び出し時の“契約”を守らなかったことにエラーの原因を求めています。「機能要件に係るもの」とは、処理呼び出し時の事前条件が満たされていないことや、処理を実行すると不変条件から逸脱することとなることを事前に検知して、処理の実行を中止した場合を表します。いずれも手続き的な問題です。
 
「失敗終了」の内容としては、当初はこの手続き的な=機能的な問題だけを想定していました。
 
「非機能要件に係るもの」とは、処理が保証する“サービスレベル”を越える程度の呼び出しがなされたと理解される場合です。例えば、「同時接続数の上限を超過した」、「計画停止中である」といった内容を想定しています。これらは性能的なあるいは運用的な問題です。「処理が保証する“サービスレベル”を越える程度の呼び出しが為された」と解される場合とは、呼び出された側は“契約”は守っている以上、呼び出した側が対処すべき、という意味において"recoverable"であり、「失敗終了」のケースに含めるべきもの、と捉えました。
 
「失敗終了」を機能要件要因と非機能要件要因とに細分するというのは、後に、各ケースによる終了はそれぞれどのようにハンドルできるかに関して言及しますが、この分類で捉えることがパターン化によく寄与するという考察にも基づいています。
 
■ 「異常終了」もさらに二つに分類
 
「異常終了」もその要因に基づいて二つに分類します。
 
- 外的要因によるもの
- 内的要因によるもの
 
「異常終了」は、呼び出された側の内部的な不具合や障害を要因としています。「外的要因」とは、JavaでいえばSQLExceptionやSocketExceptionといった外部資源あるいは基盤に係る障害の発生、一般に外部物理エラーが要因となる場合を表します。一方、Javaプログラムの実行中に予期せぬNullPointerExceptionやNumberFormatExceptionの発生でシステムが終了するようなケース、一般に内部論理エラーは内的要因に該当します。
 
終了ケース5類型のまとめ
 
これまでに導出してきた終了ケースをここにまとめます。

成功終了(※もしくは、肯定的正常終了)
 
・正常、成功、regularケース
 
失敗終了(※もしくは、否定的正常終了)〔機能要件〕
 
・機能要件に関わるirregularケース(※事前条件、不変条件からの逸脱が発生しそうになった)
 
例)「(受注機能において)指定の商品は販売停止中である」、「指定のコードの商品は存在しない」
 
失敗終了(※もしくは、否定的正常終了)〔非機能要件〕
 
・非機能要件に関わるirregularケース(※処理が保証する“サービスレベル”を越える程度の呼び出しが行われた)
 
例)「システムはメンテ中である」、「端末同時接続数が上限超過した」
 
異常終了〔外的要因〕
 
・物理障害、環境構成ミス等によるアプリケーション実行停止が発生した
 
例)「通信エラーが発生」、「接続先サーバーが見つからない」
 
異常終了〔内的要因〕
 
・プログラムコードの論理バグ、あるいは永続化データの不整合検知によるアプリケーション実行停止が発生した
 
例)「文字列値データを数値扱いしようとした」、「データAが存在するときデータBも存在しなければならない」

◆以上
 (※次回へ続きます。)