On 12/28/2013 12:50 PM, "Casper Færgemand" " 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