ストラウストラップのプログラミング入門(10) 第5章のつづき

ストラウストラップのプログラミング入門』を読む。今日は、第5章の5.5から5.8まで。

第5章のテーマは「エラー」。

印象に残ったところ

エラーチェックの処理を書く場所

呼び出し側で描くか、呼び出される側で書くか、という問題。

次の説明は、呼び出される側の関数内部で、チェックできない、あるいは、しないケースの理由についての、分かりやすい説明だと思う。

関数での引数のチェックは簡単に思えるが、必ずしも行われないのはなぜか。
(中略)

  • 関数定義を変更できない
  • 呼び出される側の関数ではエラーが発生した場合にどうすればよいかわからない
  • 呼び出される側の関数ではどこから呼び出されたのかわからない
  • パフォーマンス

# 本文には、それぞれの理由がもう少し詳しく書いてある。

より多くのプログラムによって、不特定の文脈で利用されるコードであればあるほど、この制約は大きくなるんだろうと思った。たとえば、ライブラリやフレームワークなど。

ランタイムエラー

ランタイムエラーを出してみようという呼びかけが本文に出てくるので、従った。

なんだこれ。

R6010

  • abort() has been caled

[再試行]ボタンを押すとクラッシュする。

エラーの詳細は、次のページにある…と思いきや、載ってない。

abortって、これかな。

妥当性の確認

プログラムの機能性に関する妥当性担保の話。そういう単語は出てこないけど。

妥当性を確認するにあたって厳密である必要はない。十分な推測をすれば、それでよい。

たとえば、性能テストのためのリソースプランニングでは、この考え方をする。プロジェクトのスケジュール見積りでも、そうかもしれない。

機能性に関しても、妥当性の確認についての考え方は同じらしい。ただ、「そこそこ妥当」という線引きは、それなりに経験がないと難しいけれども。

まあそれはそれとして、妥当性の確認を習慣の問題として取り上げている点と、どこまでやるかという問題に言及している点は、凄い本だと思った。

C++の文法関連

注意: C++の言語仕様を自分はほとんど知らないので、以下の記述は間違いを含む可能性があります。

(1)Javaとの違い
  • 型のオブジェクトは「new」と書かなくても生成される
  • catch句の括弧の中に書くクラスは、変数名を省略できる
  • 「その他の例外をすべてキャッチ」することができる

catch に続く ( ) には、関数の仮引数のような感じで、キャッチする例外オブジェクトの型と名前を記述します。 ただし、名前については特に使うつもりがなければ省略できます

http://www.geocities.jp/ky_webid/cpp/language/025.html
(2)入力エラーチェック

入力エラーをチェックするために、cinそのもの(戻り値)を評価してもいいらしい。

if(cin){

}else{

}

しかし、cinやcin.good()を使った入力エラーと比べると、cin.fail()の方が直感的で、やりたいことが明確だ。それに、cin.good()はif(!cin.good())のように使うと思われるが、健康上の理由により否定の!演算子は避けたい(目にやさしくない)。また、cin.bad()はbadしかチェックしないが、cin.fail()ならbadもfailもチェックしてくれる。ゆえに、cin.fail()を使うことが望ましい。

…という仮説をでっち上げたけど、実際には何が正しいのか分からない。検索した感じでは、「goodを使う」とする言説を多く見かけた。

(3)例外の型階層

exceptionという1つの型を通じてout_of_range型とruntime_error型を両方とも処理できる。(中略)exception型のことを両方の共通基盤(スーパー型)と呼ぶ。

上のページでは、logic_errorとruntime_errorがその他のエラーと同じ階層のように見えるが、実際は違うらしい。注意すること。>自分

文意が取れなかった部分

2文目が何をいっているのかよく分からなかった。

p.119

範囲エラーは、(中略)引数エラーの特例である。vectorのインデックスの範囲を常にチェックするという自信がなかったので、vectorの添え字演算子にそれをチェックさせている。

両者は違うのかな。