File: AA-11-4.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (192 lines) | stat: -rw-r--r-- 14,717 bytes parent folder | download
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Exception Handling</TITLE>
    <META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
    <META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
    <STYLE type="text/css">
    DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
    TT {font-family: "Courier New", monospace}
    DT {display: compact}
    DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
    DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Index {font-family: "Times New Roman", Times, serif}
    DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
    DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
    DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left:  10.0em; margin-bottom: 0.6em}
    DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
    DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left:  15.0em; margin-bottom: 0.6em}
    UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
    DD.Hanging {margin-left: 6.0em}
    DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.IndentedHanging {margin-left: 2.0em}
    DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.HangingInBulleted {margin-left: 4.0em}
    DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallHanging {margin-left: 7.5em}
    DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallIndentedHanging {margin-left: 2.0em}
    DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallHangingInBulleted {margin-left: 5.0em}
    DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.Enumerated {margin-left: 2.0em}
    DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallEnumerated {margin-left: 2.5em}
    DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    </STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-11-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-11-4-1.html">Next</A></P>
<HR>
<H1> 11.4 Exception Handling</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;[When an exception occurrence is raised, normal
program execution is abandoned and control is transferred to an applicable
<FONT FACE="Arial, Helvetica">exception_handler</FONT>, if any. <A NAME="I4061"></A>To
<I>handle</I> an exception occurrence is to respond to the exceptional
event. <A NAME="I4062"></A>To <I>propagate</I> an exception occurrence
is to raise it again in another context; that is, to fail to respond
to the exceptional event in the present context.] </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>In other
words, if the execution of a given construct raises an exception, but
does not handle it, the exception is propagated to an enclosing execution
(except in the case of a <FONT FACE="Arial, Helvetica">task_body</FONT>).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.b/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Propagation involves re-raising
the same exception occurrence<S>(assuming the implementation has not
taken advantage of the Implementation Permission of <A HREF="AA-11-3.html">11.3</A>)</S>.
For example, calling an entry of an uncallable task raises Tasking_Error;
this is not propagation. </FONT></DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I4063"></A><A NAME="I4064"></A>Within
a given task, if the execution of construct <I>a</I> is defined by this
International Standard to consist (in part) of the execution of construct
<I>b</I>, then while <I>b</I> is executing, the execution of <I>a</I>
is said to <I>dynamically enclose</I> the execution of <I>b</I>. <A NAME="I4065"></A>The
<I>innermost dynamically enclosing</I> execution of a given execution
is the dynamically enclosing execution that started most recently. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B><A NAME="I4066"></A><A NAME="I4067"></A>If
the execution of <I>a</I> dynamically encloses that of <I>b</I>, then
we also say that the execution of <I>b</I> is <I>included in</I> the
execution of <I>a</I>. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Examples:
The execution of an <FONT FACE="Arial, Helvetica">if_statement</FONT>
dynamically encloses the evaluation of the <FONT FACE="Arial, Helvetica">condition</FONT>
after the <B>if</B> (during that evaluation). (Recall that ``execution''
includes both ``elaboration'' and ``evaluation'', as well as other executions.)
The evaluation of a function call dynamically encloses the execution
of the <FONT FACE="Arial, Helvetica">sequence_of_statement</FONT>s of
the <FONT FACE="Arial, Helvetica">function_body</FONT> (during that execution).
Note that, due to recursion, several simultaneous executions of the same
construct can be occurring at once during the execution of a particular
task.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Dynamically enclosing is not defined
across task boundaries; a task's execution does not include the execution
of any other tasks.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Dynamically enclosing is only
defined for executions that are occurring at a given moment in time;
if an <FONT FACE="Arial, Helvetica">if_statement</FONT> is currently
executing the <FONT FACE="Arial, Helvetica">sequence_of_statement</FONT>s
after <B>then</B>, then the evaluation of the <FONT FACE="Arial, Helvetica">condition</FONT>
is no longer dynamically enclosed by the execution of the <FONT FACE="Arial, Helvetica">if_statement</FONT>
(or anything else). </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<A NAME="I4068"></A>When
an exception occurrence is raised by the execution of a given construct,
the rest of the execution of that construct is <I>abandoned</I>; that
is, any portions of the execution that have not yet taken place are not
performed. The construct is first completed, and then left, as explained
in <A HREF="AA-7-6-1.html">7.6.1</A>. Then: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the construct is a <FONT FACE="Arial, Helvetica">task_body</FONT>,
the exception does not propagate further; </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>When an exception
is raised by the execution of a <FONT FACE="Arial, Helvetica">task_body</FONT>,
there is no dynamically enclosing execution, so the exception does not
propagate any further. If the exception occurred during the activation
of the task, then the activator raises Tasking_Error, as explained in
<A HREF="AA-9-2.html">9.2</A>, ``<A HREF="AA-9-2.html">Task Execution
- Task Activation</A>'', but we don't define that as propagation; it's
a special rule. Otherwise (the exception occurred during the execution
of the <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
of the task), the task silently disappears. Thus, abnormal termination
of tasks is not always considered to be an error. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the construct is the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
of a <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
that has a handler with a choice covering the exception, the occurrence
is handled by that handler;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I4069"></A>Otherwise, the occurrence is <I>propagated</I>
to the innermost dynamically enclosing execution, which means that the
occurrence is raised again in that context. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>6.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B><A NAME="I4070"></A><A NAME="I4071"></A>As
shorthands, we refer to the <I>propagation of an exception</I>, and the
<I>propagation by a construct</I>, if the execution of the construct
propagates an exception occurrence. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I4072"></A><A NAME="I4073"></A><A NAME="I4074"></A>When
an occurrence is <I>handled</I> by a given handler, the <FONT FACE="Arial, Helvetica">choice_parameter_specification</FONT>,
if any, is first elaborated, which creates the choice parameter and initializes
it to the occurrence. Then, the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
of the handler is executed; this execution replaces the abandoned portion
of the execution of the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This ``replacement''
semantics implies that the handler can do pretty much anything the abandoned
sequence could do; for example, in a function, the handler can execute
a <FONT FACE="Arial, Helvetica">return_statement</FONT> that applies
to the function. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The rules
for exceptions raised in library units, main subprograms and partitions
follow from the normal rules, plus the semantics of the environment task
described in Section 10 (for example, the environment task of a partition
elaborates library units and calls the main subprogram). If an exception
is propagated by the main subprogram, it is propagated to the environment
task, which then terminates abnormally, causing the partition to terminate
abnormally. Although abnormal termination of tasks is not necessarily
an error, abnormal termination of a partition due to an exception <I>is</I>
an error. </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>1&nbsp;&nbsp;Note that exceptions raised
in a <FONT FACE="Arial, Helvetica">declarative_part</FONT> of a body
are not handled by the handlers of the <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
of that body. </FONT></DIV>

<HR>
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-11-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-11-4-1.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>