2010-09-23 4 views
5

wir haben ein lustiges Problem mit try catch und std :: runtime_error. Kann mir jemand erklären, warum dieser "Unbekannter Fehler" als Ausgabe zurückgibt? Vielen Dank für Ihre Hilfe!Fehler beim Abfangen von std :: runtime_error als std :: exception

#include "stdafx.h" 
#include <iostream> 
#include <stdexcept> 

int magicCode() 
{ 
    throw std::runtime_error("FunnyError"); 
} 

int funnyCatch() 
{ 
    try{ 
     magicCode(); 
    } catch (std::exception& e) { 
     throw e; 
    } 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    try 
    { 
     funnyCatch(); 
    } 
    catch (std::exception& e) 
    { 
     std::cout << e.what(); 
    } 
return 0; 
} 
+0

Es druckt "FunnyError" für mich, mit Visual C++ 2010. Welche Compiler verwenden Sie? – Doug

+0

Visual Studio 2005 – BlueTrin

Antwort

17

Das Problem ist mit dieser Linie. Da throw mit einem Ausdruck den statischen Typ dieses Ausdrucks verwendet, um die ausgelöste Ausnahme zu bestimmen, wird das Ausnahmeobjekt, das ein neues std::exception Objekt erstellt, durch Kopieren nur des Basisobjektteils von std::runtime_error, auf das e verweist, zerlegt.

throw e; 

Um die gefangene Ausnahme erneut zu werfen, sollten Sie immer throw ohne einen Ausdruck verwenden.

throw; 
+2

18 Sekunden schneller ... wie macht er es?! –

+1

Ah, 'exception's Kopierkonstruktor muss' what() 'nicht beibehalten. Das habe ich nicht bemerkt. – Doug

+0

Charles, ich dachte, dass werfen e; würde den Kopierkonstruktor std :: exception (const std :: exception e) aufrufen, was eine korrekte Kopie der Ausnahme erzeugen würde? Ist das nicht der Fall? – BlueTrin

0

fand ich eine perfekte Antwort auf dieses Problem:

C++ eine explizite Unterscheidung zwischen Referenz- und Wert Kopie macht. Verwenden

catch (const std::exception& e) 

durch Bezugnahme zu fangen anstelle von Wert.

Go geben upvotes für den ursprünglichen Responder here

+0

Ich habe nicht nach Wert Kopie zu fangen. – BlueTrin

Verwandte Themen