File: node135.html

package info (click to toggle)
babel 0.10.2-1
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 43,932 kB
  • ctags: 29,707
  • sloc: java: 74,695; ansic: 73,142; cpp: 40,649; sh: 18,411; f90: 10,062; fortran: 6,727; python: 6,406; makefile: 3,866; xml: 118; perl: 48
file content (200 lines) | stat: -rw-r--r-- 7,918 bytes parent folder | download | duplicates (2)
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>
 &nbsp; <B>  <A NAME="tex2html2726"
  HREF="node14.html">Contents</A></B> 
 &nbsp; <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,
     &amp;     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>
 &nbsp; <B>  <A NAME="tex2html2726"
  HREF="node14.html">Contents</A></B> 
 &nbsp; <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>