理論があるかどうかはわかりませんが、実用的な実験科学が生まれている可能性があります。
私が考えることができる最高の情報源は、Bjarne Stroustrup、The Design and Evolution of C ++、Addison-Wesley、1994です。私が正しく覚えている場合(非常に良い本であり、人々は私からそれを借り続けて返さないので、現時点ではコピーを持っていません)、例外に関する章があります。StroustrupのC ++委員会は、提案された機能が言語定義に追加する前に必要であるという多くの経験的証拠を必要としました。例外に関するWikipediaのページには、その本から次の引用があります。
1991年11月のパロアルト[C ++標準化]ミーティングで、個人的な経験とJim Mitchell(以前はSun、以前はXerox PARC)からのデータに裏打ちされた終了セマンティクスの議論の素晴らしい要約を聞きました。ジムは20年間にわたって6か国語で例外処理を使用し、ゼロックスのCedar / Mesaシステムの主要な設計者および実装者の1人として再開セマンティクスの初期の支持者でした。彼のメッセージは終了よりも再開よりも好まれました。これは意見の問題ではなく、長年の経験の問題です。再開は魅惑的ですが、無効です。彼はいくつかのオペレーティングシステムからの経験でこの声明を支持しました。主要な例は、Cedar / Mesaでした。これは、再開を気に入って使用した人々によって書かれましたが、10年使用した後、50万の回線システムに再開の使用は1つしかありませんでした。それはコンテキストの調査でした。このようなコンテキスト照会には再開は実際には必要ではなかったため、再開し、システムのその部分で大幅な速度の向上が見られました。再開が使用されたすべてのケースで、10年以上にわたって問題が発生し、より適切な設計がそれを置き換えました。基本的に、再開を使用するたびに、抽象化のレベルをばらばらに保つことができませんでした。再開が使用されたすべてのケースで、10年以上にわたって問題が発生し、より適切な設計がそれに取って代わりました。基本的に、再開を使用するたびに、抽象化のレベルをばらばらに保つことができませんでした。再開が使用されたすべてのケースで、10年以上にわたって問題が発生し、より適切な設計がそれを置き換えました。基本的に、再開を使用するたびに、抽象化のレベルをばらばらに保つことができませんでした。
C ++での本当の勝利はRAIIであり、これによりエラー時のリソースの割り当て解除がはるかに簡単になります。(これは、の必要性を廃止しないthrow
とtry
- catch
、それはあなたが必要がないことを意味しますfinally
。)
私は彼らに例外が必要だと確信したのはジェネリックコンテナだと思います:コンテナライターは含まれているオブジェクトが返す必要があるかもしれないエラーの種類については何も知りません(それらを処理する方法ははるかに少ない)が、それらのオブジェクトをコンテナは、それらのオブジェクトのインターフェースが何かを知る必要があります。ただし、含まれているオブジェクトがどのようなエラーをスローするかについては何も知らないため、例外タイプを標準化することはできません。(反対に、例外タイプを標準化できれば、例外は必要ありません。)
人々が長年にわたって学んだと思われる他のことは、例外仕様を言語に正しく入れることが難しいということです。例:このために参照してくださいhttp://www.gotw.ca/publications/mill22.htm、またはこの:http://www.gotw.ca/gotw/082.htm。(C ++だけではなく、Javaプログラマーは、チェック済み例外と未チェック例外の経験について長い議論を持っています。)
例外の歴史について少し。古典的な論文は次のとおりです。JohnB. Goodenough:「例外処理:問題と表記法」Commun。ACM 18(12):683-696、1975。しかし、それ以前は例外が知られていました。Mesaは1974年頃にそれらを持っていましたが、PL / Iも持っていたかもしれません。エイダは、私はC ++の例外は最大で約1976年からバーバラ・リスコフのCLUプログラミング言語の経験によって影響を受けたと信じている1980年前に、例外メカニズムを持っていた で『CLUの歴史』:バーバラ・リスコフ---プログラミング言語の歴史II、トーマスJ.ベルギンジュニアとリチャードG.ギブソンジュニア(編)。頁471から510、ACM、1996。