C ++例外について。 func()throw()
質問
このページを読んでいます http://www.cplusplus.com/doc/tutorial /exceptions.html function()throw();と書くと、その関数で例外をスローすることはできません。私はmsvc 2005でthrow()、throw(int)、throw()を書いてみましたが、何も書きませんでした。それぞれの結果はまったく同じでした。なし。私はint、char *、別の型を投げましたが、すべて同じようにキャッチされました。スローはまったく影響しないように見えます。 function()throw()は実際に何をしますか?
解決
C ++例外仕様とMicrosoftの実装の詳細については、この記事を参照してください。
Microsoft Visual C ++ 7.1は、空でない限り例外仕様を無視します。空の例外仕様は
__ declspec(nothrow)
と同等であり、コンパイラーがコードサイズを削減するのに役立ちます。[...]空の例外仕様が見つかった場合、何をしているのかを知っていると仮定し、例外を処理するためのメカニズムを最適化します。とにかくあなたの関数がスローされた場合-まあ、あなたに恥。この機能は、関数がスローせず、絶対にスローしないという100%の肯定的な場合にのみ使用してください。
他のヒント
あなたが見つけているのは、VC ++のそのバージョンは仕様の例外を強制していないということです。これは標準との差異として文書化されたと思います。
ただし、例外仕様は通常、良いアイデアではありません。プログラムが標準に準拠した実装(VS 2005のVC ++ではそうではなかった)でそれらに違反する場合、システムはそれをキャッチすることになっています。つまり、仕様はコンパイラーの最適化のヒントではなく、コンパイラーに余分な長さを強制し、最適でないコードを生成することもあります。
高く評価されているBoostの理由については、 Boostの根拠をご覧ください。プロジェクトは例外仕様を使用しません。これはBoostです。これは、言語の高度な部分で奇妙で有用なことを行うためのポスターの子です。
(ミス)の理解
2番目の問題は、 あなたが何を得ているかを知る。同数の 著者を含む著名人 Boost例外仕様の 根拠、それを置いている、 プログラマは例外を使用する傾向がある あたかも振る舞ったかのような仕様 プログラマーが望む方法、 彼らが実際に行う方法の代わりに 振る舞います。
こちら’多くの人がそう思う 例外仕様は:
関数はリストされた例外のみをスローすることを保証します(おそらく なし)。
記載されている知識のみに基づいてコンパイラの最適化を有効にします 例外(おそらくなし)は スローされます。
上記の期待は、再び、 一見正しいことに近い。
詳細についてはリンクをご覧ください。
例外をスローするだけでは不十分です。例外をキャッチするには、 try {} catch()
ブロックが必要です。例外をキャッチしない場合は、 std :: terminate()
が呼び出され、プログラムが突然終了します。少し時間をとって this にアクセスしてください。
スロー仕様は2つの目的のために設計されています:
-
実装されたインターフェイスとインターフェイスユーザーとの間のコントラクトとして機能するために、メソッドからスローできる例外を述べると、一部の人々はそれをインターフェイスの一部と見なします。 (契約)AlaはJavaの例外をチェックしました。
-
メソッド/プロシージャから例外をスローできない場合に特定の最適化を適用できることをコンパイラーに通知する方法として(例外処理の設定には何か費用がかかります)
throw()句で指定されていない例外をスローするのは間違いですが、それを検証するために必要な実装はありません。実際、サブルーチンが呼び出すサブルーチンからのすべての可能な例外が含まれているため、検証することすらできません。 (おそらく他のモジュールから)停止する問題に簡単に還元されるため、単一のモジュール内では不可能です:)