J'ai essayé de créer des classes d'exceptions personnalisées pour une bibliothèque C++ sur laquelle je travaille. Ces exceptions personnalisées capturent des informations supplémentaires, telles que le fichier, le numéro de ligne, etc., nécessaires au débogage, si, pour une raison quelconque, le test d'une exception n'est pas détecté au bon endroit. Cependant la plupart des gens semblent recommander d'hériter de la classe std :: exception dans la STL, ce que je suis d'accord, mais je me demandais peut-être qu'il serait préférable d'utiliser l'héritage multiple pour hériter de chacun des derived std::exception classes (par exemple std :: runtime_error) et une classe d'exception personnalisée, comme dans le code ci-dessous? Une autre chose, comment faire pour copier des constructeurs et des opérateurs d'assignation dans des classes d'exception? Devraient-ils être désactivés?Exceptions personnalisées en C++
class Exception{
public:
explicit Exception(const char *origin, const char *file,
const int line, const char *reason="",
const int errno=0) throw();
virtual ~Exception() throw();
virtual const char* PrintException(void) throw();
virtual int GetErrno(void);
protected:
std::string m_origin;
std::string m_file;
int m_line;
std::string m_reason;
int m_errno;
};
class RuntimeError: public virtual std::runtime_error, public Exception{
public:
explicit RuntimeError(const char *origin, const char *file,
const int line, const char *reason="",
const int errno=0) throw();
virtual ~RuntimeError() throw();
};
Qu'aimeriez-vous en tirer? Pourquoi ne pas utiliser l'héritage unique? Pourquoi avez-vous besoin de personnaliser * les exceptions * Exception et RuntimeError? – jalf
Je voulais utiliser la fonctionnalité de ma classe Exception personnalisée et maintenir la hiérarchie des exceptions STL en héritant des différentes classes std :: exception dérivées. De cette façon un attraper avec: try { throw RunTimeException (...); } catch (std :: runtime_error & e) { ... } catch (std :: exception & e) {...} permet également d'intercepter ma classe personnalisée. Cela pourrait être une perte de temps. Je pourrais aussi juste essayer { throw RunTimeException (...); } catch (std :: exception & e) {...} mais il pourrait alors être plus difficile d'identifier l'exception. Je ne sais pas quelle est la pratique typique lorsque les classes d'exception personnalisées? – Tom
Je dirais juste hériter de std :: runtime_error (ou std :: exception). Si vous voulez un traitement spécifique, vous pouvez avoir plusieurs prises après tout. –