Exception throwing

Continuing with the Fibonocci example used in Subsections 8.2.2 and 8.3.5, the FORTRAN 77 code that throws the exceptions is$:$


        subroutine ExceptionTest_Fib_getFib_fi(self, n, max_depth,
     &     max_value, depth, retval, exception)
        implicit none
        integer*8 self, exception, ignored
        integer*4 n, max_depth, max_value, depth, retval
C       DO-NOT-DELETE splicer.begin(ExceptionTest.Fib.getFib)
        character*(*) myfilename 
        parameter(myfilename='ExceptionTest_Fib_Impl.f')
C ...lines of code deleted...
        if (n .lt. 0) then
          call ExceptionTest_NegativeValueException__create_f(exception
     $          ,ignored)
          if (exception .ne. 0) then
            call ExceptionTest_NegativeValueException_setNote_f(
     $             exception, 
     $             'called with negative n', ignored)
            call ExceptionTest_NegativeValueException_add_f(
     $             exception, 
     $             myfilename,
     $             57, 
     $             'ExceptionTest_Fib_getFib_impl', ignored)
            return
          endif
C ...lines of code deleted...        
C       DO-NOT-DELETE splicer.end(ExceptionTest.Fib.getFib)
        end

Not all exceptions are thrown in this example in order to keep its length down. The interested reader is encouraged to refer to the corresponding regression tests for the complete routine.

When an exception is thrown, the implementation should deleteRef any references it was planning to return to the caller because the caller is instructed to ignore any returned values under those circumstances. In general, when throwing an exception, it is good practice to set all out and inout array, class, and interface arguments to zero before returning. This makes things work out better for clients who forget to check if an exception occurred or willfully choose to ignore it.

NOTE$:$ It is typically safe to assume that calling deleteRef, _cast or _cast2 on an exception will never cause an exception to be thrown because returned exceptions are always local.



babel-1.4.0
users_guide Last Modified 2008-10-16

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