Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Exit überspringt finally- block


-:SID:- - Mi 25.06.08 16:16
Titel: Exit überspringt finally- block
Laut Definition (Delphi 7) soll der Aufruf von exit innerhalb eines try..finally- Blocks nicht zum Ende der Methode springen, sondern auf den ersten Befehl im finally..end- Block.

Ich habe jetzt das Problem, daß exit immer zum Ende springt, folgendes Konstrukt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure Meine.Methode;
var
  EnableMainForm : boolean;
  ...
begin
  try
    ...
    if assigned (MainCmdList) and (MainCmdList.Count < 2then begin
      EnableMainForm := true;
      exit;   // <-- hier springt er direkt zum Ende der Methode und nicht in den finally- Block
    end;
    ... weiterer Code ...
  finally
    if (not Application.ShowMainForm) and EnableMainForm then begin
      ... wichtiger Code, wird übersprungen ...
    end;
    ...
  end;   //finally
end;   //Meine.Methode


Es liegt nicht an der Optimierung, die ist aus.
Hatte jemand schon mal dieses Problem ?


huuuuuh - Mi 25.06.08 16:25

den weiterencode nach dem if könntest du auch in einen else block schreiben, dann hättest du das problem nich


-:SID:- - Mi 25.06.08 16:37

Hi ! Danke für die schnelle Antwort :D
Das wäre eine Möglichkeit, allerdings hätte ich dann sehr viele verschachtelte else- Zweige, da nach diesem Code- Fragment noch einige solche Konstrukte kommen (siehe ...weiterer Code...). Die Verwendung von exit sollte die Code- Übersicht erhöhen.
Das generelle Problem ist, daß man sich anscheinend nicht darauf verlassen kann, daß exit immer in den finally- Block seiner Ebene springt.
Gibt es vielleicht eine Compiler- Einstellung, etc., die das Problem verursacht ?


Yogu - Mi 25.06.08 16:47

Hallo,

mir ist das auch schon aufgefallen. Allerdings hatte ich im letzen Projekt einen großen Bug, bis ich merkte, dass finally trotz Exit ausgeführt wurde. Früher war es garantiert nicht so - ich habe keine Ahnung, was da der Unterschied war.

Grüße,
Yogu


Narses - Mi 25.06.08 17:21
Titel: Re: Exit überspringt finally- block
Moin und :welcome: im Forum!

user profile icon-:SID:- hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure Meine.Methode;
var
  EnableMainForm : boolean;
  ...
begin
  try
    ...
    if assigned (MainCmdList) and (MainCmdList.Count < 2then begin
      EnableMainForm := true;
      exit;   // <-- hier springt er direkt zum Ende der Methode und nicht in den finally- Block
    end;
    ... weiterer Code ...
  finally
    ShowMessage('finally erreicht!');
    if (not Application.ShowMainForm) and EnableMainForm then begin
      ... wichtiger Code, wird übersprungen ...
    end;
    ...
  end;   //finally
end;   //Meine.Methode
Probier´s doch einfach mal aus. :idea: ;)

cu
Narses


Yogu - Mi 25.06.08 17:28

Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
try
  Exit;
finally
  ShowMessage('Finally erreicht');
end;

Verläuft bei mir positiv (Die Meldung erscheint).

Grüße,
Yogu


IceBube - Mi 25.06.08 17:39

Könntest ja auch so machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure Meine.Methode; 
var 
  EnableMainForm : boolean; 
  ... 
begin 
  try 
    ... 
    if assigned (MainCmdList) and (MainCmdList.Count < 2then begin 
      EnableMainForm := true; 
      //Hier einfach erneut den Code der übersprungen wird ausführen...
       ... wichtiger Code, wird übersprungen ... 

      exit;   // <-- hier springt er direkt zum Ende der Methode und nicht in den finally- Block 
    end
    ... weiterer Code ... 
  finally 
    if (not Application.ShowMainForm) and EnableMainForm then begin 
      ... wichtiger Code, wird übersprungen ... 
    end
    ... 
  end;   //finally 
end;   //Meine.Methode


Edit:
Wird wahrscheinlich an dem liegen?!


Delphi-Quelltext
1:
if (not Application.ShowMainForm) and EnableMainForm then begin                    


Trotzdem komisch das die Methode nicht ausgeführt wird...

lg


Xentar - Mi 25.06.08 20:15

Setz da mal nen Haltepunkt, und schau dir an, wie die Variablen stehen..


-:SID:- - Do 26.06.08 08:51

Also der Haltepunkt im finally- Block wurde nie erreicht, beim Steppen war ich nach Exit bei:
end; //Meine.Methode

Ich habe das Problem jetzt durch Umstrukturieren gelöst, jetzt funktioniert es.
Vielen Dank für die Tips.