should postconditions be evaluated even if Exception is thrown?
Denis Koroskin
2korden at gmail.com
Thu Dec 3 01:32:47 PST 2009
On Thu, 03 Dec 2009 06:51:32 +0300, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> If a function throws a class inheriting Error but not Exception (i.e. an
> unrecoverable error), then the postcondition doesn't need to be
> satisfied.
>
> I just realized that postconditions, however, must be satisfied if the
> function throws an Exception-derived object. There is no more return
> value, but the function must leave everything in a consistent state. For
> example, a function reading text from a file may have the postcondition
> that it closes the file, even though it may throw a malformed file
> exception.
>
> This may sound crazy, but if you just follow the facts that distinguish
> regular error handling from program correctness, you must live with the
> consequences. And the consequence is - a function's postcondition must
> be designed to take into account exceptional paths. Only in case of
> unrecoverable errors is the function relieved of its duty.
>
>
> Andrei
I'm not sure about post-conditions, but invariants have to be called.
Exception-safe programming is a must. Any function may fail, and in that
happens, the function should leave an object it operates on in a correct
state.
With post-conditions, there is a pitfall: if function throws an exception,
there is no return value, and nothing to verify. For example:
float sqrt(float value)
out (result)
{
assert(value * value == result);
}
body
{
assert(value >= 0); // might throw. What value the 'result' variable
in a post-condition would store?
return core.stdc.sqrt(value);
}
Reading your post for a second time, I think you are confusing
post-condition with something else. How would you close a file in a
post-condition (or an invariant)? I believe both should be
@relaxedPure/hasNoSideEffects. File closing should be done in a function
body using scope (exit) mechanism.
More information about the Digitalmars-d
mailing list