He intentado crear algunas clases de excepciones personalizadas para una biblioteca C++ en la que estoy trabajando. Estas excepciones personalizadas capturan información adicional, como archivo, número de línea, etc., necesaria para la depuración, si por alguna razón al probar una excepción no se detecta en el lugar correcto. Sin embargo, la mayoría de las personas parecen recomendar heredar de la clase std :: exception en el STL, con lo cual estoy de acuerdo, pero me preguntaba si tal vez sería mejor usar herencia múltiple para heredar de cada uno de los derived std::exception classes (por ejemplo, std :: runtime_error) y una clase de excepción personalizada, como en el código de abajo?Excepciones personalizadas en C++
Otra cosa, ¿cómo se puede hacer para copiar constructores y operadores de asignación en clases de excepción? ¿Deberían estar deshabilitados?
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é ganarías de esto? ¿Por qué no usar herencia individual? ¿Por qué necesita personalizar las excepciones * both * Exception y RuntimeError? – jalf
Quería utilizar la funcionalidad de mi clase Exception personalizada y mantener la jerarquía de excepciones STL heredando de las distintas clases derivadas std :: exception. De esta manera, un truco con: try { throw RunTimeException (...); } catch (std :: runtime_error & e) { ... } catch (std :: exception & e) {...} también captaría mi clase personalizada. Aunque podría ser una pérdida de tiempo. También podría simplemente intentar { arrojar RunTimeException (...); } catch (std :: exception & e) {...} pero podría dificultar la identificación de la excepción. No sé cuál es la práctica típica cuando las clases de excepción personalizada? – Tom
Yo diría heredar de std :: runtime_error (o std :: exception). Si desea un tratamiento específico, puede tener múltiples capturas después de todo. –