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_;
};
}
As you see through the comment, the destructor of class Error
explicitly provides an empty implementation with no-throw specifier.
Question: Is this necessary? Or is this a good practice comparing to let the compiler generate a implicit destructor?
In C++11, destructors are implicitly
throw()
(unless any member or base of the type has a destructor with a different exception specification) so if you are compiling in C++11 mode there is no need.If you are in C++03, you might want to add it, but whether it will have an effect or not is very implementation defined... Now, for documentation purposes you might want to add it, but again, it is commonly assumed that destructors don't throw.