2010-09-10 4 views
6

J'essaie de faire un runtime_error personnalisé simple. Je définis la classe:Comment faire ma propre classe d'erreur d'exécution personnalisée?

#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()){} 
}; 

}; 

Je jette l'erreur:

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); 
    } 
} 

Et j'utiliser un bloc try/catch

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

Erreur d'exécution est lancée correctement comme FileNotFoundException mais la ligne avec std :: cout n'est jamais atteint et aucune ligne n'est écrite sur la console.

Toutes les idées sont les bienvenues. Merci!

+0

Vous pouvez utiliser un argument par défaut au lieu de redéfinir dans votre classe d'exception. –

Répondre

13

C'est parce que vous lancez un pointeur. Faites simplement: throw FileNotFoundException(msg);.

Chaque fois que vous utilisez un pointeur, à moins de le placer dans un conteneur/wrapper, vous ne faites probablement pas la bonne chose.

5

Vous écrivez throw new FileNotFoundException(msg), il devrait être 'throw FileNotFoundException (msg)'. La règle est lancer par valeur, attraper par référence.

+1

Sauf si vous êtes Microsoft avec MFC, la règle est lancée par pointeur et capture par pointeur. Ils ont créé leurs classes d'exceptions avant d'avoir un support complet pour le lancer/catch standard, ce qui a abouti à quelques compromis intéressants. –

3

Vous lancez actuellement un pointeur sur un objet affecté par le tas (FileNotFoundException *) afin que les types ne correspondent pas. Généralement, lancer par valeur et attraper par référence (rule 73). BTW, avec la déclaration suivante, vous créez une copie de la chaîne msg.

1

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

Write "const std :: string & msg" au lieu. Il mettra juste une référence sur une pile. Alors que maintenant vous mettez toute la chaîne sur une pile.

+0

Corrigé! Merci pour l'idée! – Killrazor

Questions connexes