2010-09-10 35 views
6

Sto provando a eseguire un runtime_error personalizzato semplice. Io definisco la classe:Come eseguire la mia classe di errore runtime personalizzata?

#include <string> 
#include <stdexcept> 


namespace utils{ 

class FileNotFoundException: public std::runtime_error{ 
    public: 
    FileNotFoundException():runtime_error("File not found"){} 
    FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 
}; 

}; 

Poi butto l'errore:

bool checkFileExistence(std::string fileName) 
{ 
    boost::filesystem::path full_path = boost::filesystem::system_complete(boost::filesystem::path(fileName)); 
    if (!boost::filesystem::exists(full_path)) 
    { 
    char msg[500]; 
    _snprintf(msg,500,"File %s doesn't exist",fileName.c_str()); 
    throw new FileNotFoundException(msg); 
    } 
} 

e io uso un blocco try/catch

try{ 
      checkFileExistence(fileName); 
    } 
    catch(utils::FileNotFoundException& fnfe) 
     { 
      std::cout << fnfe.what() << std::endl; 
    } 

Errore di runtime sia correttamente gettato come FileNotFoundException ma la linea con std :: cout non viene mai raggiunto e nessuna riga viene scritta sulla console.

Tutte le idee sono benvenute. Grazie!

+0

È possibile utilizzare un argomento predefinito anziché eseguire l'override della classe di eccezioni. –

risposta

13

Questo perché stai lanciando un puntatore. Basta fare: throw FileNotFoundException(msg);.

Ogni volta che si utilizza un puntatore, a meno che non lo si inserisca in un contenitore/involucro probabilmente non si sta facendo la cosa giusta.

5

Si scrive throw new FileNotFoundException(msg), dovrebbe essere 'gettare FileNotFoundException (msg)'. La regola è valore per valore, cattura per riferimento.

+1

A meno che non si sia Microsoft con MFC, la regola viene lanciata per puntatore e acquisita per puntatore. Hanno creato le loro classi di eccezioni prima che avessero il pieno supporto per il tiro/presa standard, il che ha portato ad alcuni compromessi interessanti. –

3

Si sta effettivamente lanciando un puntatore a un oggetto assegnato all'heap (FileNotFoundException *) in modo che i tipi non corrispondano. Generalmente, tira per valore e cattura per riferimento (rule 73).

1

BTW, con la seguente dichiarazione si crea una copia della stringa msg.

FileNotFoundException(std::string msg):runtime_error(msg.c_str()){} 

Write "const std :: string & msg", invece. Metterà solo un riferimento in pila. Mentre ora metti l'intera stringa in pila.

+0

corretto! Grazie per l'idea! – Killrazor

Problemi correlati