1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2002-2-1 (1.70)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Catching and Throwing Exceptions in FORTRAN 77</TITLE>
<META NAME="description" CONTENT="Catching and Throwing Exceptions in FORTRAN 77">
<META NAME="keywords" CONTENT="users_guide">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="users_guide.css">
<LINK REL="next" HREF="node136.html">
<LINK REL="previous" HREF="node134.html">
<LINK REL="up" HREF="node131.html">
<LINK REL="next" HREF="node136.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html2729"
HREF="node136.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html2723"
HREF="node131.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html2717"
HREF="node134.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html2725"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html2727"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html2730"
HREF="node136.html">Invoking Babel to generate</A>
<B> Up:</B> <A NAME="tex2html2724"
HREF="node131.html">FORTRAN 77 Bindings</A>
<B> Previous:</B> <A NAME="tex2html2718"
HREF="node134.html">Calling Methods From FORTRAN</A>
<B> <A NAME="tex2html2726"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html2728"
HREF="node317.html">Index</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<H1><A NAME="SECTION03340000000000000000"></A>
<A NAME="7273"></A>
<BR>
Catching and Throwing Exceptions in FORTRAN 77
</H1>
<P>
When a method can throw an exception (i.e., its SIDL definition has a
throws clause), an extra variable of type <TT>INTEGER*8</TT> should be
passed to hold a pointer if an exception is thrown. For maximum
backward compatibility, the base exception type argument is
<TT><I CLASS="slanted">sidl.BaseInterface</I></TT> though the base exception class is
<TT><I CLASS="slanted">sidl.SIDLException</I></TT>. The exception argument appears after the
return value when both occur in a method. After the call, the client
must test this argument. If a function does not test the exception
argument, thrown exceptions will be utterly ignored -- not propagated
to higher level functions. If the exception parameter is non-zero, an
exception was thrown by the method, and the method should respond
appropriately. When an exception is thrown, the value of all other
arguments is undefined.
<P>
Here is another example adapted from the Babel regression tests.
Package ExceptionTest has a class named Fib with a method declared in
SIDL as follows:
<P>
<BR>
<PRE CLASS="verbatim">int getFib(in int n, in int max_depth, in int max_value, in int depth)
throws NegativeValueException, FibException;
</I></PRE></td></tr></table></blockquote>
<P>
Here is the outline of a FORTRAN 77 code fragment to use this
method. When an exception is thrown, the value of the <TT>out</TT> and
<TT>inout</TT> parameters is unknown, the best practice is to ignore
their values.
<P>
<BR>
<PRE CLASS="verbatim"> integer*8 fib, except, except2
integer*4 index, maxdepth, maxval, depth, result
call ExceptionTest_Fib__create_f(fib)
index = 4
maxdepth = 100
maxvalue = 32000
depth = 0
call ExceptionTest_getFib_f(fib, index, maxdepth,
$ maxvalue, depth, result, except)
if (except .ne. 0) then
call ExceptionTest_FibException__cast_f(except, except2)
if (except2 .ne. 0) then
c do something here with the FibException
else
call ExceptionTest_NegativeValueException__cast_f
$ (exception, except2)
c do something here with the NegativeValueException
endif
call sidl_BaseException_deleteRef_f(except)
else
write (*,*) 'getFib for ', index, ' returned ', result
endif
call ExceptionTest_Fib_deleteRef_f(fib)
</PRE></td></tr></table></blockquote>
<P>
Here is an example of FORTRAN 77 code that throws an exception.
<P>
<BR>
<PRE CLASS="verbatim"> subroutine ExceptionTest_Fib_getFib_fi(self, n, max_depth,
& max_value, depth, retval, exception)
implicit none
integer*8 self, exception
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)
if (exception .ne. 0) then
call ExceptionTest_NegativeValueException_setNote_f(
$ exception,
$ 'called with negative n')
call ExceptionTest_NegativeValueException_add_f(
$ exception,
$ myfilename,
$ 57,
$ 'ExceptionTest_Fib_getFib_impl')
return
endif
C ...lines of code deleted...
C DO-NOT-DELETE splicer.end(ExceptionTest.Fib.getFib)
end
</PRE></td></tr></table></blockquote>
<P>
Please note that when your code throws an exception it should
<TT>deleteRef</TT> any references it was planning to return to its
caller. Any caller of a method that returns an exception should ignore
the values of <TT>out</TT> and <TT>inout</TT> parameters, so anything you
do not free will become a reference and memory leak. In general, it is
good practice to set all <TT>out</TT> and <TT>inout</TT> array, class and
interface arguments before returning when throwing an exception. This
makes things work out better for clients who forget to check if an
exception occurred or willfully choose to ignore it.
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html2729"
HREF="node136.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html2723"
HREF="node131.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html2717"
HREF="node134.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html2725"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html2727"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html2730"
HREF="node136.html">Invoking Babel to generate</A>
<B> Up:</B> <A NAME="tex2html2724"
HREF="node131.html">FORTRAN 77 Bindings</A>
<B> Previous:</B> <A NAME="tex2html2718"
HREF="node134.html">Calling Methods From FORTRAN</A>
<B> <A NAME="tex2html2726"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html2728"
HREF="node317.html">Index</A></B> </DIV>
<!--End of Navigation Panel-->
<ADDRESS>
<br><br>babel-0.10.2<br>users_guide Last Modified 2005-03-23<br><br><a href="http://www.llnl.gov/CASC/components">http://www.llnl.gov/CASC/components</a><br><a href="mailto:components@llnl.gov">components@llnl.gov</a>
</ADDRESS>
</BODY>
</HTML>
|