Exception throwing

Below is an example of an implementation subroutine that throws an exception. The returned exception object pointer must be cast into the exception out parameter. This example also utilizes two methods, inherited from sidl.BaseException and implemented in sidl.SIDLException, that aid client-side debugging. The first, setNote, allows the developer to provide a useful error message. The second, add, provides a multi-language traceback capability -- assuming each layer of the call stack invokes add before it propagates the exception.


recursive subroutine ExceptionTest_Fib_getFib_mi(self, n, max_depth, &
  max_value, depth, retval, exception)
  use sidl
  use sidl_BaseInterface
  use ExceptionTest_Fib
  use ExceptionTest_NegativeValueException
  use ExceptionTest_FibException
  use ExceptionTest_Fib_impl
  ! DO-NOT-DELETE splicer.begin(ExceptionTest.Fib.getFib.use)
  use ExceptionTest_TooBigException
  use ExceptionTest_TooDeepException
  ! DO-NOT-DELETE splicer.end(ExceptionTest.Fib.getFib.use)
  implicit none
  type(ExceptionTest_Fib_t) :: self
  integer (kind=sidl_int) :: n, max_depth, max_value
  integer (kind=sidl_int) :: retval, depth
  type(sidl_BaseInterface_t) :: exception
  type(sidl_BaseInterface_t) :: except2
! DO-NOT-DELETE splicer.begin(ExceptionTest.Fib.getFib)
  type(ExceptionTest_NegativeValueException_t) :: negexc
! ...lines deleted...
  character (len=*) myfilename 
  parameter(myfilename='ExceptionTest_Fib_Impl.f')
  retval = 0
  if (n .lt. 0) then
     call new(negexc, except2)
     if (not_null(negexc)) then
        call setNote(negexc, &
             'called with negative n', except2)
        call add(negexc, myfilename, 57, &
                 'ExceptionTest_Fib_getFib_impl', except2)
        call cast(negexc, exception, except2)
	call deleteRef(negexc, except2)
        return
     endif
  else
! ...numerous lines deleted....
! DO-NOT-DELETE splicer.end(ExceptionTest.Fib.getFib)
end subroutine ExceptionTest_Fib_getFib_mi

When an exception is thrown, the implementation should deleteRef any references it was planning to return to its caller. In general, when throwing an exception, it is good practice to call set_null on all out and inout array, class, and interface arguments before returning. This makes things work out better for clients who forget to check if an exception occurred or willfully choose to ignore it.





babel-1.4.0
users_guide Last Modified 2008-10-16

http://www.llnl.gov/CASC/components
components@llnl.gov