2013-06-20 6 views
8

次のプログラムは常に "Error:double 10.2"を出力します。C++での例外処理: "throw(int)"使用時にdoubleをスローする

なぜか分かりません。 私によれば、fun1()がintだけをスローすることができる場合、プログラムは (1)をクラッシュするか(2)を破棄するか、doubleをintに変更してスローします。 これは、出力が "Error:int 10"であることを意味します。しかし、これは当てはまりません。誰でも説明できますか?

void fun1() throw (int) 
{ 
    cout<<"3"; 
    throw 10.2; 
    cout<<"4"; 
} 

int main() 
{ 
    try { fun1(); } 
    catch(int i) { cout<<"Error:int" <<i <<endl;} 
    catch(double i) { cout << "Error:double" << i << endl; } 
    cout << endl; 
    return 0; 
} 
+10

'throw'関数の宣言を使用しないでください。これは駄目な機能であり、廃止予定です。 – piokuc

+0

MSVCを使用していますか?それは実際には例外仕様をサポートしませんでした。 – Fanael

+4

これは 'int main()'でなければなりません。 –

答えて

9

コンパイラは標準に準拠していません。標準に従って、double例外をエスケープするfun1の後にstd::unexpectedを呼び出して終了する必要があります。
これは、例外仕様を使用していないと述べています。彼らは非難され、役に立たない。

+3

そして、その理由について興味深い記事があります:http://www.gotw.ca/publications/mill22 .htm –

3

MSVCは、単純に、throw(...)にすなわち同等の、「何かを投げることができる」これはC++ 03標準に準拠していないException Specifications (MSDN)

参照の意味としてthrow(int)を扱いますが、実際にはC++ 03よりも有用ですこれはC++ 11標準の精神に近いものです。 C++ 11 throw(X)

が廃止され、例外仕様の新しい形態は、MSVCがサポートする全てである、noexceptthrow()throw(...)に相当noexcept(true)又はnoexcept(false)、とすることができます。

旧式の例外仕様を使用する場合は、を使用して「スローされません」と何も入力しないか、throw(...)と入力してthrow(X)を使用しないでください。それはC++ 03とC++ 11、およびすべてのコンパイラで一貫して動作します。

+1

MSVCは '" throw()とマークされた関数から例外がスローされた場合、Visual C++コンパイラは予期しない呼び出しをしません " /msdn.microsoft.com/en-us/library/wfa0edys.aspx)。 MSVCと標準に準拠したコンパイラの間では、 'throw '指定を移植することはできません。 – Casey

+0

ああ、私はそれを忘れていたので、 'noexcept(true)'関数(または 'throw()')が呼び出されたとき 'std :: terminate()'が呼び出されるというC++ 11のセマンティクスとは一致しません。 () ')throws –

関連する問題