Gerade dann wenn zwischen dem try und dem except bzw. dem finally viel Quelltext steht, wenn sich innerhalb dessen noch ein paar try-Blöcke aufhalten, dann wird es schon recht unübersichtlich. Und auf das Problem als solches aufmerksam wurde ich, weil ich genau den Fall hatte wie im Eingangspost beschrieben: Eine Transaction sollte ein Rollback im Except-Fall machen und ein Commit im Finally-Fall. Allerdings musste ich das durch einen boolschen "Nebenläufer" absichern.
Exceptions sollten nicht zur normalen Ablaufsteuerung verwendet werden. Der finally Block ist für Code zum Freigeben von Objekten und anderen Systemresourcen vorgesehen.
Es geht ganz ohne "Nebenläufer":
Delphi-Quellcode:
BeginTransaction;
try
MachWasMitDerDatenbank;
CommitTransaction;
except
RollbackTransaction;
end;