Since all methods can now throw sidl.RuntimeException , Babel ensures there is an out argument to hold an exception. If not explicitly specified, Babel will automatically add the argument. For maximum backward compatibility and consistency, the argument is of type sidl.BaseInterface. When the exception parameter value is not NULL, an exception has been thrown. In that case, the caller should ignore the value of the other out parameters as well as any return value.
To facilitate exception management, sidl_Exception.h provides several
helper utilities. Chief among them are
SIDL_CHECK,
SIDL_CATCH,
and SIDL_CLEAR.
Their use follows from their names. Their signatures are
/* Macros to facilitate managing exceptions */ SIDL_CHECK(EX_VAR) SIDL_CLEAR(EX_VAR) /* Helper function to facilitate catching exceptions of a specific type */ int SIDL_CATCH(struct sidl_BaseInterface__object *ex_var, const char *sidl_Name);
EX_VAR (or ex_var) is the exception object itself and sidl_NAME is the string name of the exception type expected to be caught.
The following example, based on the getFib method from
Subsection 6.2.2, illustrates not only catching an
exception but determining whether it is one of the types identified
in the specification
#include "sidl_Exception.h" /* ...numerous lines deleted... */ int x; sidl_BaseInterface _ex = NULL; x = ExceptionTest_Fib_getFib(f, 10, 1, 100, 0, &_ex); if (SIDL_CATCH(_ex, "ExceptionTest.TooDeepException")) { traceback(_ex); SIDL_CLEAR(_ex); } else if (SIDL_CATCH(_ex, "ExceptionTest.TooBigException")) { traceback(_ex); SIDL_CLEAR(_ex); } else if (_ex == NULL) { return FALSE; } SIDL_CHECK(_ex); return TRUE; EXIT:; traceback(_ex); SIDL_CLEAR(_ex); return FALSE;
As an alternative to using SIDL_CHECK, _ex can be compared to NULL directly. Similarly, instead of using SIDL_CATCH, type casting can used to determine which of the potential exception types was actually thrown.