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 < 2) then begin EnableMainForm := true; exit; end; ... weiterer Code ... finally if (not Application.ShowMainForm) and EnableMainForm then begin ... wichtiger Code, wird übersprungen ... end; ... end; end; |
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!
-: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 < 2) then begin EnableMainForm := true; exit; end; ... weiterer Code ... finally ShowMessage('finally erreicht!'); if (not Application.ShowMainForm) and EnableMainForm then begin ... wichtiger Code, wird übersprungen ... end; ... end; end; | |
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 < 2) then begin EnableMainForm := true; ... wichtiger Code, wird übersprungen ...
exit; end; ... weiterer Code ... finally if (not Application.ShowMainForm) and EnableMainForm then begin ... wichtiger Code, wird übersprungen ... end; ... end; end; |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!