On Saturday, 9 August 2014 at 00:17:07 UTC, Jonathan M Davis
wrote:
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
If that was the case, the error would have said it's illegal to
throw from "finally or scope bodies". The fact that it
specifically specifies `scope(exit)` and `scope(success)` and
leave out `scope(failure)` means that whoever wrote that error
message made a conscious decision that it's OK to return in
`scope(failure)`.