2010-09-23 9 views
5

abbiamo un problema divertente con try catch e std :: runtime_error. Qualcuno può spiegarmi perché questo sta restituendo "Errore sconosciuto" come output? Grazie mille per avermi aiutato!Errore nel rilevare std :: runtime_error come 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

Esso stampa "FunnyError" per me, utilizzando Visual C++ 2010. Quale compilatore stai usando? – Doug

+0

Visual Studio 2005 – BlueTrin

risposta

17

Il problema è con questa linea. Poiché throw con un'espressione utilizza il tipo statico di tale espressione per determinare l'eccezione generata, questo taglia l'oggetto di eccezione che costruisce un nuovo oggetto std::exception copiando solo la parte dell'oggetto di base di std::runtime_error a cui fa riferimento e.

throw e; 

Per ripetere l'eccezione rilevata, è necessario utilizzare sempre il lancio senza espressione.

throw; 
+2

18 secondi più veloce ... come fa ?! –

+1

Ah, il costruttore di copie di 'exception' non deve conservare' what() '. Non me ne sono reso conto. – Doug

+0

Charles, pensavo che lanciare e; chiamerebbe il costruttore di copie std :: exception (const std :: exception e), che creerebbe una copia corretta dell'eccezione? Non è il caso? – BlueTrin

0

ho trovato una risposta perfetta a questo problema:

C++ rende una esplicita distinzione tra riferimento e copia il valore. Utilizzare

catch (const std::exception& e) 

per catturare con riferimento al posto di valore.

Go dare upvotes per il risponditore originale here

+0

Non ho rilevato la copia del valore. – BlueTrin

Problemi correlati