2009-09-11 4 views
13

私はC++例外を統一的に使い始めましたが、コンパイラ(g ++)には「例外リーク」がないことを確認したいと思います。 throwデコレーションは、これを行う必要があります。constは、クラスメソッドのconstanceのためです。C++スロー装飾の用途はありますか?

まあ、そうではありません。

throwを使用すると、ドキュメントに記載されている以外の例外をスローすることができないと他の人が考えている場合でも、誤解を招く恐れがあります。

g ++はスローチェックでもっと厳密になるように説得することができます。すなわち、throw()として装飾された関数が決して何も投げないようにすることができます。

編集: が見つかりました。this question件名を広く扱っています。

+0

同様の質問に誤解:http://stackoverflow.com/questions/1037575/why-arent-exceptions-in-c-checked-by-the-compiler – Glen

答えて

15

コンパイル時はチェックされませんが、コンパイラは実行時にそれを確認する必要があります。

関数がスロー宣言の外側に何かをスローすると、C++ランタイムは正しく呼び出すとstd :: unexpectedを呼び出す必要があります。

+0

私です理解も。なぜそれをしたいのですか?私は分かりません。私は個人的には、 'GetFoo()// throws(std :: runtime_error)'が、コードの消費者のヒントと同じように、非コメントよりもはるかに便利です。 –

+1

修正します。コンパイル時チェックの実際の問題は、ほとんどの既存のC++コードにスロー指定がないことです。 – MSalters

+8

Visual C++ 2008は、この標準部分をサポートしていません。 –

0

チェッカー/コンパイラがそれを行うことができるかどうかわかりません。関数宣言でコメントする方が簡単かもしれません。まあそれは愚かな証拠ではありませんが、人々が大部分の人がtryとcatchで関数呼び出しをラップするよりも例外がスローされることがあることがわかっている場合。

//Can throw Exception 
GetFoo(); 
2

基本的に、例外仕様は空の例外仕様としてのみ有効です。そうでなければ、彼らは失敗した実験だと思う。なぜphlipsy's answerを参照してください。

8

例外仕様については、thisエッセイを参照することをおすすめします。これは、コンパイラのチェックがスローされますが指定されていない例外の場合のトリガーのデフォルトの動作のみランタイム

  • で例外がスローされた影の型システム
    • :それはのように、このC++の機能の問題を指摘します通常は使用不可能となり、多くの場合、プログラマがここに
  • 関連する問題