Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi finally wird nach exit nicht abgearbeitet (https://www.delphipraxis.net/172035-finally-wird-nach-exit-nicht-abgearbeitet.html)

messie 10. Dez 2012 09:50

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;

Zacherl 10. Dez 2012 10:03

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.

DeddyH 10. Dez 2012 10:09

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.

jaenicke 10. Dez 2012 10:16

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, ...

messie 10. Dez 2012 10:19

AW: finally wird nach exit nicht abgearbeitet
 
Zitat:

Zitat von DeddyH (Beitrag 1194910)
Und hast Du einmal einen Haltepunkt in den finally-Block gesetzt? Der sollte nämlich auch bei einem exit immer ausgeführt werden.

Eben darum ging es. Jetzt habe ich mehr Quelltext in den finally-block gesetzt und es geht. Merkwürdig. Ist ein D6-Projekt von 2005, das verhält sich manchmal komisch.

Danke, Messie

jaenicke 10. Dez 2012 12:29

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.

shmia 11. Dez 2012 14:05

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:
Connection.BeginTrans; // Schreibweise hängt von den Zugriffskomponenten ab
try
  DoWork;
  Connection.CommitTrans;
except
  Connection.RollbackTrans;
end;
Dabei ist es sehr sinnvoll für
Delphi-Quellcode:
DoWork
tatsächlich eine Prozedure zu verwenden.
Man trennt so die eigentliche Arbeit von der Transaktionssteuerung.
Das heisst also entweder wird in
Delphi-Quellcode:
DoWork
eine Exception geworfen => dann erfolgt ein Rollback.
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:
Abort
aufrufen.

jsheyer 11. Dez 2012 14:28

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

jaenicke 11. Dez 2012 14:32

AW: finally wird nach exit nicht abgearbeitet
 
Zitat:

Zitat von jsheyer (Beitrag 1195064)
vielleicht bin ich ja gerade im falschen Film, aber wird mit exit, nicht direkt die ganze procedure verlassen und daher greift das nicht??

Ja, bist du. :mrgreen:
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.

himitsu 11. Dez 2012 14:41

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"

jsheyer 11. Dez 2012 14:44

AW: finally wird nach exit nicht abgearbeitet
 
Danke für das auf die Sprünge helfen ;-)
Da ich das in so einer konstellation nach Möglichkeit nicht benutze, war ich mir nicht sicher.
Aber man lernt ja nie aus :-)

LG
Jörg

Popov 11. Dez 2012 14:56

AW: finally wird nach exit nicht abgearbeitet
 
Exit ist ok, nehme ich in der Regal auch, aber kennst du Abort? Das ist eine Stille Exception. Damit geht es bewußt in den Finally oder Except Block.

jsheyer 11. Dez 2012 15:05

AW: finally wird nach exit nicht abgearbeitet
 
ja klar, kenne ich.
Das benutze ich auch schon mal zum testen, was passiert wenn an einer bestimmten Stelle die Ausführung abbrechen würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz