should postconditions be evaluated even if Exception is thrown?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Dec 3 09:41:01 PST 2009
Denis Koroskin wrote:
> 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.
The language would need to allow you to write an out(result)
postcondition and an out(Exception) postcondition.
Andrei
More information about the Digitalmars-d
mailing list