Próbuję utworzyć niestandardowe klasy wyjątków dla biblioteki C++, nad którą pracuję. Te niestandardowe wyjątki przechwytują dodatkowe informacje, takie jak plik, numer linii itp., Potrzebne do debugowania, jeśli z jakiegoś powodu podczas testowania wyjątek nie zostanie przechwycony we właściwym miejscu. Jednak większość ludzi wydaje się polecać dziedziczenie z klasy std :: exception w STL, z czym się zgadzam, ale zastanawiałem się, może lepiej byłoby użyć dziedziczenia wielokrotnego, aby odziedziczyć po każdym z derived std::exception classes (np. Std :: runtime_error) i niestandardową klasą wyjątków, jak w poniższym kodzie?Niestandardowe wyjątki w C++
Kolejna kwestia, w jaki sposób można kopiować konstruktory i operatory przypisania w klasach wyjątków? Czy powinny być wyłączone?
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();
};
Co zyskałbyś na tym? Dlaczego nie skorzystać z pojedynczego dziedziczenia? Dlaczego musisz dostosować * wyjątki * Wyjątek i RuntimeError? – jalf
Chciałem użyć funkcjonalności z mojej niestandardowej klasy wyjątków i utrzymywać hierarchię wyjątków STL, dziedzicząc z różnych pochodnych klas std :: exception. W ten sposób złap z: spróbuj { throw RunTimeException (...); } catch (std :: runtime_error & e) { ... } catch (std :: exception & e) {...} również złapie moją niestandardową klasę. Jednak może to być strata czasu. Mogę też po prostu spróbować { throw RunTimeException (...); } catch (std :: exception & e) {...} , ale może to utrudnić identyfikację wyjątku. Nie wiem, jaka jest typowa praktyka, gdy niestandardowe klasy wyjątków? – Tom
Powiedziałbym po prostu dziedziczyć ze std :: runtime_error (lub std :: exception). Jeśli chcesz konkretnego leczenia, możesz mimo wszystko mieć wiele haczyków. –