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

Reply via email to