On Friday, 8 August 2014 at 12:22:49 UTC, Idan Arye wrote:
On Friday, 8 August 2014 at 08:37:37 UTC, Messenger wrote:
On Friday, 8 August 2014 at 00:27:21 UTC, Jonathan M Davis
wrote:
On Thursday, 7 August 2014 at 20:59:45 UTC, Messenger wrote:
On Thursday, 7 August 2014 at 20:54:02 UTC, Jonathan M Davis
wrote:
I'd say that if you're trying to use scope in any situation
where you'd try and handle an exception, then you're using
it wrong.
But it's super convenient.
It fundamentally doesn't work to handle an exception with a
scope guard. They rethrow the exception.
void fun() {
scope(failure) return;
throw new Exception(__FUNCTION__);
}
void main() {
import std.exception;
assertNotThrown(fun());
}
Initially I thought this was a bug, but this seems intended
since it doesn't work with `scope(exit)` - it yields the
compiler error "Error: return statements cannot be in finally,
scope(exit) or scope(success) bodies".
I suspect that it says that because someone complained about the
error talking about finally when they had used scope(exit) and
not finally. The fact that scope statements get lower to
try-catch-finally blocks allow for a few screwy things that were
not intended. Whether those things will be left in or made
illegal at this point is another matter, but I'm sure that it was
never the intention that anyone be allowed to return from any
kind of scope statement or do anything else which would cause the
exception to not be rethrown.
- Jonathan M Davis