自分用メモ – C++ エラーハンドリング
- エラーの種類
- logic error
プログラミングミスによるもの - runtime error
プログラマでは防げないもの
eg. “network service unavailable” error
- logic error
- C-style や COM によるエラーハンドリング
- 関数の実行毎に error code を返したり
eg. return HRESULT - グローバルオブジェクトから caller が選択的にエラーコードを取得できる様にしたり
eg. GetLastError()
- 関数の実行毎に error code を返したり
- assert
- 開発時に絶対起こり得ない条件に対して assert を使用する
- exception
- ランタイムで発生し得るエラーは exception を返す
- 利用者がリカバーできる場合に使用する
eg. “file not found” or “out of memory.” - cf. MS では arguments チェックは exception としている※
何故ならどんな値の組み合わせが入力されるか分からないから。Always check arguments to public functions by using exceptions. Even if your function is error-free, you might not have complete control over arguments that a user might pass to it.
- 勿論契約プログラミングでは※とは限らない
- 契約プログラミングにおいて利用者が適切な引数を渡す責務がありライブラリでは不適切な引数をアサートする
cf. Pragmatic Programmer – Design by Contract section (chapter 4)
- 契約プログラミングにおいて利用者が適切な引数を渡す責務がありライブラリでは不適切な引数をアサートする
- パラメーター Validation の方法(契約プログラミングとか関係なく)
- Validation コストを気にするなら Validation しないメソッドを追加する事もできる
- パラメーター Validation の是非に関する議論
- ある機能を提供するインタフェースで Result を返すものとその他を返すものが混在しているインタフェースについて
- 統一感が無いというデメリットはある
- 実際にそういうインタフェースになっている API もある
eg. d3d12x.h では HRESULT を返す必要が無いものは返していない。
コメントを残す