Ho cercato di creare alcune classi di eccezioni personalizzate per una libreria C++ su cui sto lavorando. Queste eccezioni personalizzate acquisiscono informazioni extra, come file, numero di riga, ecc., Necessarie per il debug, se per qualche motivo durante il test un'eccezione non viene catturata nel posto giusto. Tuttavia la maggior parte delle persone sembra raccomandare di ereditare dalla classe std :: exception in STL, che sono d'accordo, ma mi chiedevo forse sarebbe meglio usare ereditarietà multiple per ereditare da ciascuno degli derived std::exception classes (ad esempio std :: runtime_error) e una classe di eccezioni personalizzate, come nel codice qui sotto?Eccezioni personalizzate in C++
Un'altra cosa, come si fa a copiare i costruttori di copia e gli operatori di assegnazione nelle classi di eccezioni? Dovrebbero essere disabilitati?
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();
};
Cosa vorresti ottenere da questo? Perché non usare l'ereditarietà singola? Perché è necessario personalizzare * entrambe le eccezioni * Eccezione e RuntimeError? – jalf
Volevo utilizzare la funzionalità della mia classe Exception personalizzata e mantenere la gerarchia delle eccezioni STL ereditando dalle varie classi derivate std :: exception. In questo modo un problema con: try { throw RunTimeException (...); } catch (std :: runtime_error & e) { ... } catch (std :: exception & e) {...} prenderebbe anche la mia classe personalizzata. Potrebbe essere una perdita di tempo però. Potrei anche solo provare { lanciare RunTimeException (...); } catch (std :: exception & e) {...} ma potrebbe rendere più difficile identificare l'eccezione. Non so quale sia la pratica tipica quando le classi di eccezioni personalizzate? – Tom
Direi solo ereditare da std :: runtime_error (o std :: exception). Se vuoi un trattamento specifico, puoi avere più catture dopo tutto. –