2013-06-20 3 views
8

Das folgende Programm gibt immer "Error: double 10.2" aus.Ausnahmebehandlung in C++: Werfen eines Doppels bei Verwendung von "throw (int)"

Ich verstehe nicht warum. Laut mir, wenn fun1() erlaubt nur Int geworfen werden, sollte das Programm entweder (1) crash (2) oder ändern Sie die Doppel zu einem int und dann werfen. Dies bedeutet, die Ausgabe sollte "Fehler: Int 10" sein. Dies ist jedoch nicht der Fall. Kann mir jemand erklären?

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

Verwenden Sie nicht die 'throw' Funktionsdeklaration, es ist ein Mist-Feature und es wurde veraltet. – piokuc

+0

Verwenden Sie MSVC? Es hat nie wirklich Ausnahmenspezifikationen unterstützt. – Fanael

+4

Das sollte 'int main()' sein. –

Antwort

9

Ihr Compiler ist nicht standardkonform. Standardmäßig sollte Ihr Programm mit dem Aufruf std::unexpected enden, nachdem Sie double Ausnahme escape fun1.
Das sagte - keine Ausnahmespezifikationen verwenden. Sie sind veraltet und nutzlos.

+3

Und hier ist eine interessante Lektüre zum Thema warum: http://www.gotw.ca/publications/mill22 .htm –

3

MSVC behandelt throw(int) dahin einfach „etwas werfen“, also äquivalent zu throw(...) finden Exception Specifications (MSDN)

Dies ist nicht auf die C++ 03-Standard nicht entspricht, ist aber eigentlich nützlicher als die C++ 03 Verhalten und liegt näher am Geist des C++ 11-Standards.

In C++ 11 throw(X) veraltet ist, noexcept die neue Form der Ausnahmespezifikation und kann noexcept(true) oder noexcept(false) entspricht throw() und throw(...), die alle ist, die MSVC unterstützt.

Wenn Sie die alten Stil Ausnahme-Spezifikationen verwenden möchten, verwenden Sie einfach throw() zu sagen „nicht werfen“ und entweder nichts oder throw(...) zu sagen „könnte werfen“, und nicht throw(X) verwenden. Das wird in C++ 03 und C++ 11 und über alle Compiler hinweg konsistent funktionieren.

+1

MSVC unterstützt 'throw()' entweder nicht: ["Wenn jedoch eine Ausnahme aus einer mit throw() markierten Funktion ausgelöst wird, ruft der Visual C++ - Compiler nicht unerwartet ..."] auf (http://msdn.microsoft.com/en-us/library/wfa0edys.aspx). Sie können keine beliebige 'throw'-Spezifikation portabel zwischen MSVC und einem standardkonformen Compiler verwenden. – Casey

+0

Ah ja, ich habe das vergessen ... also stimmt es nicht mit der C++ 11-Semantik überein, die besagt, dass 'std :: terminate()' aufgerufen wird, wenn eine 'noexcept (true)' -Funktion (oder 'throw() ') wirft –

Verwandte Themen