![]() |
finally wird nach exit nicht abgearbeitet
Moin,
was habe ich da denn falsch gemacht? Wenn ich mit Exit den Block verlassen möchte, wird die finally-Anweisung übersprungen :? Ein LoadFromDB liefert false. Danach möchte ich abbrechen und die Transaction abschließen. Das passiert aber nicht. In einem "normalen" Beispiel geht es. Eine Exception habe ich nicht. Gibt es irgendwelche Compilerdirektiven, die das beeinflussen? Grüße, Messie
Code:
var
idx : integer; s : string; begin Result := False; try try while not DM.IBCQuery1.Eof do begin //irgendwelche DB-Queries // if not (LoadAFromDB(idx) and LoadBFromDB(idx)) then begin result := False; // hier komme ich raus exit; end; DM.IBCQuery1.Next; end; DM.IBCTransaction1.Commit; Result := True; except Result := False; end; finally DM.IBCTransaction1.Active := False; end; end; |
AW: finally wird nach exit nicht abgearbeitet
Komische Sache. Nur sone Idee, aber probier die Geschichte doch testweise bitte mal ohne den inneren try .. except Block.
|
AW: finally wird nach exit nicht abgearbeitet
Und wenn Du vor dem exit ein Rollback machst? Und hast Du einmal einen Haltepunkt in den finally-Block gesetzt? Der sollte nämlich auch bei einem exit immer ausgeführt werden.
|
AW: finally wird nach exit nicht abgearbeitet
Hast du mal mit OutputDebugMessage oder ShowMessage geprüft, wo du lang kommst? Sprich, ob du vor dem Exit ankommst, in dem Finally, ...
|
AW: finally wird nach exit nicht abgearbeitet
Zitat:
Danke, Messie |
AW: finally wird nach exit nicht abgearbeitet
Dann war die Unit vermutlich nicht neu kompiliert worden. Das sieht man normalerweise aber an den blauen Punkten links ganz gut.
|
AW: finally wird nach exit nicht abgearbeitet
Also mir scheint der ganze Code etwas strukturlos zu sein.
Im Prinzip muss eine Transaktion so ablaufen:
Delphi-Quellcode:
Dabei ist es sehr sinnvoll für
Connection.BeginTrans; // Schreibweise hängt von den Zugriffskomponenten ab
try DoWork; Connection.CommitTrans; except Connection.RollbackTrans; end;
Delphi-Quellcode:
tatsächlich eine Prozedure zu verwenden.
DoWork
Man trennt so die eigentliche Arbeit von der Transaktionssteuerung. Das heisst also entweder wird in
Delphi-Quellcode:
eine Exception geworfen => dann erfolgt ein Rollback.
DoWork
Oder es wird keine Exception geworfen => dann erfolgt kein Rollback sondern ein Commit. Möchte man innerhalb der Procedure abbrechen, dann kann man z.B. einfach
Delphi-Quellcode:
aufrufen.
Abort
|
AW: finally wird nach exit nicht abgearbeitet
Hallo,
vielleicht bin ich ja gerade im falschen Film, aber wird mit exit, nicht direkt die ganze procedure verlassen und daher greift das nicht?? Ich hätte an der Stelle ja auch ein break; benutzt um nur die while Schleife zu beenden. Ansonsten stimme ich natürlich messie zu :-) LG Jörg |
AW: finally wird nach exit nicht abgearbeitet
Zitat:
Finally-Blöcke werden trotz Exit oder einer Exception abgearbeitet, genau dafür sind sie da: Um immer abgearbeitet zu werden um aufzuräumen, egal was passiert ist. |
AW: finally wird nach exit nicht abgearbeitet
Ein "Exit" zwischen Try-Finally/Except löst eine Stille Exception aus, ähnlich dem Abort.
Damit rauscht der Exit-Aufruf durch alle Finally-Blöcke durch, bis hin zum END der Prozedur/Funktion, wo diese Exit-Exception in einem impliziten Try-Finally dann abgefangen und die Prozedur verlassen wird. Also ja, Exit führt auch die Finallies us. - ohne Try-Except/Finally ist es ein JUMP zum Prozedur-Ende - mit Try-Except/Finally ist es eine "Exception" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz