scope(faliure) flow control.

Ali Çehreli acehreli at yahoo.com
Sat Dec 28 13:45:41 PST 2013


On 12/28/2013 12:50 PM, "Casper Færgemand" <shorttail at hotmail.com>" wrote:

 > On Saturday, 28 December 2013 at 20:31:14 UTC, TheFlyingFiddle wrote:
 >> int foo()
 >> {
 >>    scope(failure) return 22;
 >>    throw new Exception("E");
 >> }
 >>
 >> unittest
 >> {
 >>    assert(foo() == 22);
 >> }
 >>
 >> Is this defined behavior? At least in x64 dmd the exception is
 >> swallowed and the assert evaluates to true.
 >>
 >> In any case what should happen? Should the method return or should the
 >> exception be propagated up the callstack?
 >
 > It's rewritten as follows:
 >
 > int foo()
 > {
 >     try {
 >        throw new Exception("E");
 >     } catch (Exception e) { // or whatever the D syntax is, I never 
used it
 >        return 22;

There must also be the re-throwing of the caught exception:

          throw e;

What happens is, the return statement does not allow that to happen.

 >     }
 > }
 >
 > So yes, it's intended. scope(exit) uses finally instead of catch.

The spec brings restrictions to scope(exit) and scope(success) but does 
not say much about scope(failure):

   http://dlang.org/statement.html#ScopeGuardStatement

Yeah, it appears that OP's code is legal.

Ali



More information about the Digitalmars-d-learn mailing list