| /* This example illustrates the use of the %exceptionclass feature. By | |
| default, if a method has a throws specification then SWIG will generate | |
| code to catch the exception and pass it on the scripting language. | |
| If a method does not have a throws specification, but does throw | |
| an exception, then the %exceptionclass feature can be used to tell | |
| SWIG about the exception class so it can be properly added to Ruby. | |
| This is done by making the exception class inherit from rb_eRuntimeError.*/ | |
| %module example | |
| %{ | |
| #include "example.h" | |
| %} | |
| /* The EmptyError doesn't appear in a throw declaration, and hence | |
| we need to tell SWIG that the dequeue method throws it. This can | |
| now be done via the %catches feature. */ | |
| %catches(FullError) *::enqueue; | |
| %catches(EmptyError) *::dequeue(); | |
| /* What the catches clause is doing under the covers is this: | |
| %exceptionclass EmptyError; | |
| %exception *::dequeue { | |
| try { | |
| $action | |
| } catch(EmptyError& e) { | |
| // Create a new instance of the EmptyError, wrap it as a Ruby object that Ruby owns, | |
| // and return it as the exception. For this to work EmtpyError must inherit from | |
| // a standard Ruby exception class such as rb_eRuntimeError. SWIG automatically does | |
| // this when the class is marked as %exceptionclass or is a throws specification. | |
| %raise(SWIG_NewPointerObj(new EmptyError(e),SWIGTYPE_p_EmptyError, SWIG_POINTER_OWN), | |
| "EmptyError", SWIGTYPE_p_EmptyError); | |
| } | |
| } | |
| */ | |
| /* Grab the original header file */ | |
| %include "example.h" | |
| /* Instantiate a few templates */ | |
| %template(IntQueue) Queue<int>; | |
| %template(DoubleQueue) Queue<double>; |