From: Alan E & Carmel J Brain <aebrain@dynamite.com.au>
Subject: Re: Building blocks (Was: Design By Contract)
Date: 1997/09/24
Date: 1997-09-24T00:00:00+00:00 [thread overview]
Message-ID: <342A0AC6.2F2F@dynamite.com.au> (raw)
In-Reply-To: 3423BE13.9C3852A4@munich.netsurf.de
Joachim Durchholz wrote:
> Personally, I'd prefer the C++/Java style:
> try
> -- code that may raise an exception
> on <exception identification> do
> -- exception handler
> on <other exception id> do
> ...
> end
> (ad-hoc syntax).
>
> I don't like the Ada solution either. It is "structured" in that it will
> resume execution at the point where the execution occurred, but that's
> *very* wrong. The exception handler can't know at which point in the
> code the exception occurred (maybe even in a subroutine!), so it can't
> know what to do to fix the problem.
Eh???
The syntax for Ada looks like:
procedure WhatEver is
begin
-- statements
-- more statements
-- end of normal execution
exception
when SOME_ERROR => do something;
when SOME_OTHER_ERROR => do something else;
when others => raise; -- just propogate to caller
end WhatEver;
There is no resumption! Any exception raised between the "begin" and
"exception" immediately causes abandonment of normal execution, like a
GOTO, to the exception block.
If you want to resume, or retry, or whatever, you need to confine the
exception to it's own block. A typical example looks something like:
(Declarations, Constants omitted for simplicity)
UnTransmitted := true;
ReTryCounter := 0;
while UnTransmitted loop
if ReTryCounter > MaxRetries then
raise LineContinuouslyBusy; end if; -- Line Too busy
-- Report this upwards
Transmission_Attempt_Block :
begin
Ethernet.TryToTransmit;
UnTransmitted := false; -- Successful Transmission
exception
when Ethernet.LINE_BUSY =>
ReTryCounter := ReTryCounter+1; -- Try again
-- Note that this 'handles'
-- the exception
when Ethernet.NACK =>
Untransmitted := false; -- Ignore Negative Ack.
-- Again, exception handled.
when others => raise;
-- something unexpected and Nasty, Propagate it out!
end Transmission_Attempt_Block;
end loop;
Note that the LINE_BUSY exception, declared in package ETHERNET is
normal, expected, and handlable locally, at least up to a point. Any
other exceptions coming from a call to Ethernet.TryToTransmit will be
propagated upwards and outwards: there is not enough data locally to
determine what to do here. Similarly, if the line is continuously busy,
an exception stating this is propagated upwards. In the case of a NACK
exception, cross fingers, hope it's OK, etc. Normally a VERY bad idea,
but on hardware which gives 30% or more false positives, it may be the
only way to go.
Personally, I like the flexibility.
--
aebrain@dynamite.com.au <> <> How doth the little Crocodile
| Alan & Carmel Brain| xxxxx Improve his shining tail?
| Canberra Australia | xxxxxHxHxxxxxx _MMMMMMMMM_MMMMMMMMM
abrain@cs.adfa.oz.au o OO*O^^^^O*OO o oo oo oo oo
By pulling MAERKLIN Wagons, in 1/220 Scale
next prev parent reply other threads:[~1997-09-24 0:00 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
1997-09-09 0:00 Building blocks (Was: Design By Contract) Marc Wachowitz
1997-09-15 0:00 ` Joachim Durchholz
1997-09-17 0:00 ` Paul Johnson
1997-09-18 0:00 ` Robert Dewar
1997-09-18 0:00 ` Stephen Leake
1997-09-18 0:00 ` Mark L. Fussell
[not found] ` <11861963wnr@eiffel.demon.co.uk>
1997-09-19 0:00 ` Mark L. Fussell
1997-09-19 0:00 ` Robert A Duff
1997-09-20 0:00 ` Joachim Durchholz
1997-09-22 0:00 ` Matthew Heaney
1997-09-23 0:00 ` Veli-Pekka Nousiainen
1997-10-03 0:00 ` Robert I. Eachus
1997-10-04 0:00 ` Paul Johnson
1997-10-14 0:00 ` Robert I. Eachus
1997-09-23 0:00 ` Joachim Durchholz
1997-09-23 0:00 ` Jon S Anthony
1997-09-24 0:00 ` Alan E & Carmel J Brain [this message]
1997-09-25 0:00 ` Anonymous
1997-09-30 0:00 ` Alan E & Carmel J Brain
1997-09-30 0:00 ` Matthew Heaney
1997-09-30 0:00 ` Neil Wilson
1997-09-30 0:00 ` Stephen Leake
1997-09-30 0:00 ` W. Wesley Groleau x4923
1997-09-30 0:00 ` Matthew Heaney
1997-10-01 0:00 ` Alan E & Carmel J Brain
1997-10-01 0:00 ` Anonymous
1997-10-01 0:00 ` Joachim Durchholz
1997-10-01 0:00 ` Paul M Gover
1997-10-04 0:00 ` Paul Johnson
1997-10-04 0:00 ` Matthew Heaney
1997-10-15 0:00 ` Paul Johnson
1997-10-15 0:00 ` Matthew Heaney
1997-10-16 0:00 ` Joachim Durchholz
1997-10-17 0:00 ` Robert I. Eachus
1997-10-16 0:00 ` Joachim Durchholz
1997-10-22 0:00 ` Reimer Behrends
1997-10-02 0:00 ` Robert A Duff
1997-10-02 0:00 ` Tucker Taft
1997-10-02 0:00 ` Matthew Heaney
1997-10-03 0:00 ` Stephen Leake
1997-10-04 0:00 ` Matthew Heaney
1997-10-07 0:00 ` Robert A Duff
1997-09-24 0:00 ` Richard A. O'Keefe
1997-09-19 0:00 ` Jon S Anthony
1997-09-23 0:00 ` Mark L. Fussell
1997-09-18 0:00 ` W. Wesley Groleau x4923
1997-09-21 0:00 ` Matthew Heaney
1997-09-18 0:00 ` Jon S Anthony
-- strict thread matches above, loose matches on Subject: below --
1997-09-11 0:00 Robert Dewar
1997-09-09 0:00 Marc Wachowitz
1997-09-02 0:00 Design By Contract Jon S Anthony
[not found] ` <JSA.97Sep3201329@alexandria.organon.com>
1997-09-04 0:00 ` Paul Johnson
[not found] ` <5un58u$9ih$1@gonzo.sun3.iaf.nl>
1997-09-06 0:00 ` Building blocks (Was: Design By Contract) Joachim Durchholz
1997-09-08 0:00 ` Paul Johnson
1997-09-08 0:00 ` Brian Rogoff
1997-09-09 0:00 ` Veli-Pekka Nousiainen
1997-09-09 0:00 ` Jon S Anthony
1997-09-09 0:00 ` Veli-Pekka Nousiainen
1997-09-09 0:00 ` Matthew Heaney
1997-09-09 0:00 ` Brian Rogoff
1997-09-09 0:00 ` W. Wesley Groleau x4923
1997-09-10 0:00 ` Robert A Duff
1997-09-12 0:00 ` Jon S Anthony
1997-09-10 0:00 ` Robert Dewar
1997-09-12 0:00 ` Paul Johnson
1997-09-14 0:00 ` Robert Dewar
1997-09-15 0:00 ` John G. Volan
1997-09-14 0:00 ` Robert Dewar
1997-09-14 0:00 ` Robert Dewar
1997-09-12 0:00 ` Jon S Anthony
1997-09-12 0:00 ` Robert Dewar
1997-09-16 0:00 ` Brian Rogoff
1997-09-10 0:00 ` Paul Johnson
1997-09-10 0:00 ` Matthew Heaney
1997-09-10 0:00 ` Darren New
1997-09-09 0:00 ` W. Wesley Groleau x4923
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox