Я пытался создать некоторые настраиваемые классы исключений для библиотеки C++, над которой я работаю. Эти пользовательские исключения захватывают дополнительную информацию, такую как файл, номер строки и т. Д., Необходимые для отладки, если по какой-то причине при тестировании исключения не попадают в нужное место. Однако большинство людей, похоже, рекомендуют наследовать из класса std :: exception в STL, с которым я согласен, но мне было интересно, возможно, было бы лучше использовать множественное наследование для наследования от каждого из derived std::exception classes (например, std :: runtime_error) и настраиваемый класс исключений, как в приведенном ниже коде?Пользовательские исключения в 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();
};
Что бы вы получили от этого? Почему бы не использовать одиночное наследование? Зачем вам нужно настраивать * оба исключения Exception и RuntimeError? – jalf
Я хотел использовать функциональность из своего пользовательского класса Exception и поддерживать иерархию исключений STL, наследуя от различных производных классов std :: exception. Таким образом, улов с: try { throw RunTimeException (...); } catch (std :: runtime_error & e) { ... } catch (std :: exception & e) {...} также поймает мой пользовательский класс. Это может быть пустая трата времени. Я мог бы также просто try { throw RunTimeException (...); } catch (std :: exception & e) {...} , но это может затруднить идентификацию исключения. Я не знаю, какова типичная практика, когда пользовательские классы исключений? – Tom
Я бы сказал, просто наследуем от std :: runtime_error (или std :: exception). Если вам требуется конкретное лечение, у вас может быть несколько уловов в конце концов. –