namespace QuantLib {
//! Base error class
class Error : public std::exception {
public:
/*! The explicit use of this constructor is not advised.
Use the QL_FAIL macro instead.
*/
Error(const std::string& file,
long line,
const std::string& functionName,
const std::string& message = "");
/*! the automatically generated destructor would
not have the throw specifier.
*/
~Error() throw() {}
//! returns the error message.
const char* what() const throw();
private:
boost::shared_ptr<std::string> message_;
};
}
Como puede ver a través del comentario, el destructor de la clase Error
proporciona explícitamente una implementación vacía con especificador de no-tiro.¿Deberíamos proporcionar un destructor con un especificador de no-tiro?
Pregunta: ¿Es esto necesario? ¿O es una buena práctica comparar para permitir que el compilador genere un destructor implícito?
Tuve que agregar un destructor de tiro no a mi clase de excepción que se derivó de std :: exception para eliminar una advertencia o error que gcc emitió cuando no había proporcionado uno. No le gustó que la clase derivada no tuviera la misma especificación de no-throw que la clase base. –
* Si * decides hacer esto, utilizaría 'noexcept' en lugar de' throw() ', si es posible. Las especificaciones de excepciones dinámicas (incluido 'throw()', al menos tal como yo lo leo) están en desuso (aunque si su compilador no está preparado para el rapé, es posible que no pueda hacerlo). –