Comparing Exceptions and Errors
Steven Schveighoffer
schveiguy at gmail.com
Mon Jun 13 13:15:42 UTC 2022
On 6/12/22 4:11 PM, kdevel 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:
>>
>> ```d
>> conn.exec("START TRANSACTION");
>> scope(success) conn.exec("COMMIT");
>> scope(failure) conn.exec("ROLLBACK");
>> ```
>
> Are there multiple (successful) returns in your code or why are you
> executing the COMMIT under a scope exit clause?
No, usually just one (the implicit final return).
> If there is only one
> successful return wouldn't it enhance code readability when an explicit
> COMMIT precedes the return?
It just introduces another place where I can mess up the transaction. I
can write these 3 lines, and be done, never having to worry about the
transaction code again.
This is one of the major features of scope guards.
> Is the ROLLBACK really necessary?
Yes. If you don't execute the rollback and start executing more DB
calls, they all get included in the transaction (and might be expected
to be).
> Isn't the transaction not committed
> (i.e. rolled back) when the db handle is closed?
Possibly, but I don't close the handle. It goes back to a pool to get
reused.
> Why not have a
> Transaction class (struct)?
A transaction class/struct cannot hook normal return and throwing
differently (the destructor has no way of knowing whether an exception
is in flight).
-Steve
More information about the Digitalmars-d-learn
mailing list