Chris Moore wrote:
> Pascal Obry wrote:
>
>> Simon Wright a écrit :
>>
>>> You might want to handle the problem locally:
>>>
>>> procedure Patati_Patata is
>>> begin
>>> declare
>>> S : String := A_Function_Raising_Constraint_Error;
>>> begin
>>> -- some code
>>> exception
>>> when Constraint_Error =>
>>> -- deal with the problem and carry on ..
>>> end;
>>> -- .. here
>>
>>
>> This one is wrong. The exception on the declare section can't be
>> handled on the local block as it will raised outside of the block.
>>
>> Pascal.
>>
>
> You are correct.
Yes.
> I have to say this is an entirely non-intuitive "feature" of the
language.
I beg to differ. The program should be read as
declare <some variables>
begin <do something with those variables> end;
The exception handler is within the "begin..end" block, not on the
"declare". (Indenting the "begin..exception..end" structure one
level beyond the "declare" would make this more visible, but is not
common practice.)
> We talk about declare blocks and yet the
> scope of the exception handlers doesn't include the declarations!
The declared variables are visible in the whole "begin..end" block,
including in the exception handler. If the declarations raise an
exception, it would be madness to try to handle it within the
"begin..end" block, because the handler could try to use
un-elaborated (non-existent) variables.
The solution is just to add one more "begin..end" block, enclosing
the "declare .. begin .. end", and handle the exceptions in this
outer "begin..end" block. Or handle the exceptions in the
subprogram's "begin..end" block and nest the "declare..begin..end"
within the subprograms "begin..end".
That said, I admit that I, too, have made this mistake once or
twice. But not lately.
I wonder if it would be a good idea for Ada to allow an exception
handler also in the "declare" part, as follows:
-- NOT Ada!
declare <some variables>
exception <handle exceptions raised in the declarations>
begin <some statements>
exception <handle exceptions raised in the statements>
end;
Of course, in this proposal the declaration-exception handler would
not have access to the declared variables.
--
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
. @[EMAIL PROTECTED]
.


|