mirror of https://github.com/swig/swig
48 lines
1.6 KiB
OpenEdge ABL
48 lines
1.6 KiB
OpenEdge ABL
/* 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>;
|