On 6/7/22 3:58 PM, frame wrote:
> On Tuesday, 7 June 2022 at 18:37:13 UTC, Steven Schveighoffer wrote:
> My very common use of scope(failure)
for my DB code:
conn.exec("START TRANSACTION");
scope(success) conn.exec("COMMIT");
scope(failure) conn.exec("ROLLBACK");
This is hard to encapsulate into a type, as dtors only hook scope(exit)
essentially.
-Steve
That's fine as the Throwable is still thrown but since scope(failure)
acts as like catch-block, people may use it as replacement if there is something more to do.
I personally like the clean, short syntax when I don't care about the actual exception or if I know the called function has already handled the exception and just rethrows it:
bool fun() {
scope(failure) {
// do something
return false;
}
badCode();
return true;
}
Wait, what?
I'm looking at the spec and it says:
A scope(exit) or scope(success) statement may not exit with a throw, goto, break, continue, or return; nor may it be entered with a goto.
Which specifically does not include scope(failure).
I would never have expected that to be a "feature"...
> I know this is bad as I'm capturing a possible error here - but this is what an unexperienced coder would do, because it works. The better approach would be to use scope(exception)
(not typed, just as keyword) that allows to act only on Exceptions so one cannot break Exception vs Error paradigma and this also clarifies that usage of scope(failure)
is potentially dangerous if you return from it.
Anyway, I just put that here - maybe you mention it in your blog.
Ali's linked bug report suggests that it's happening for Errors too, which is going to cause major problems if something didn't get cleaned up properly.
I will update the blog post. My recommendation is going to be, don't circumvent the propagation of the throwable for now. Instead use a try
+ catch(Exception)
. I think we need a compiler change to not allow return if it's catching an Error.
There may be other "weird" cases that are not covered by the spec. Is it legal to goto a label inside scope(failure)?
Thanks for the heads up!
-Steve