ifndef Rice__Exception_defn__hpp_ define Rice__Exception_defn__hpp_
include “Exception_Base_defn.hpp” include “String.hpp” include “Address_Registration_Guard_defn.hpp”
include <stdexcept> include “detail/ruby.hpp”
namespace Rice {
//! A placeholder for Ruby exceptions.
! You can use this to safely throw a Ruby exception using C++ syntax: \code VALUE foo(VALUE self) { RUBY_TRY { throw Rice::Exception(rb_eMyException, "uh oh!"); RUBY_CATCH } \endcode
class Exception
: public Exception_Base
{ public:
//! Construct a Exception with the exception e. explicit Exception(VALUE e); //! Copy constructor. Exception(Exception const & other); //! Construct a Exception with printf-style formatting. /*! \param exc either an exception object or a class that inherits from Exception. \param fmt a printf-style format string \param ... the arguments to the format string. / Exception(Object exc, char const * fmt, ...); //! Destructor virtual ~Exception() throw() { } //! Get the message the exception holds /*! \return the result of calling message() on the underlying exception object. / String message() const; //! Get message as a char const *. /*! If message is a non-string object, then this function will attempt to throw an exception (which it can't do because of the no-throw specification). \return the underlying C pointer of the underlying message object. / virtual char const * what() const throw();
private:
// Keep message around in case someone calls what() and then the GC // gets invoked. mutable VALUE message_; Address_Registration_Guard message_guard_;
};
} // namespace Rice
endif // Rice__Exception_defn__hpp_