1 #ifndef Rice__ruby_try_catch__hpp_
2 #define Rice__ruby_try_catch__hpp_
4 #include "Exception_Base_defn.hpp"
5 #include "Jump_Tag.hpp"
6 #include "detail/ruby.hpp"
18 VALUE Rice__ruby_exc = Qnil; \
19 int Rice__ruby_jump_tag = 0; \
21 goto start_of_RUBY_TRY; \
23 Rice__ruby_exception: \
24 rb_exc_raise(Rice__ruby_exc); \
25 Rice__ruby_jump_tag: \
26 rb_jump_tag(Rice__ruby_jump_tag); \
36 #define RUBY_RETHROW(ex) \
37 Rice__ruby_exc = ex; \
38 goto Rice__ruby_exception;
44 catch(::Rice::Exception_Base const & ex) \
46 RUBY_RETHROW(ex.value()); \
48 catch(::Rice::Jump_Tag const & ex) \
50 Rice__ruby_jump_tag = ex.tag; \
51 goto Rice__ruby_jump_tag; \
53 catch(std::bad_alloc const & ex) \
58 RUBY_RETHROW(rb_exc_new2(rb_eNoMemError, ex.what())); \
60 catch(std::invalid_argument const & ex) \
63 RUBY_RETHROW(rb_exc_new2(rb_eArgError, ex.what())); \
65 catch(std::domain_error const & ex) \
68 RUBY_RETHROW(rb_exc_new2(rb_eFloatDomainError, ex.what())); \
70 catch(std::out_of_range const & ex) \
73 RUBY_RETHROW(rb_exc_new2(rb_eRangeError, ex.what())); \
75 catch(std::exception const & ex) \
78 RUBY_RETHROW(rb_exc_new2(rb_eRuntimeError, ex.what())); \
82 RUBY_RETHROW(rb_exc_new2(rb_eRuntimeError, "unknown C++ exception thrown")); \