EXIT in einer Prozedur "abfangen"
Es kommt schon mal vor, daß man am Anfang einer Prozedur eine Aktion ausführt, die man am Ende der Prozedur wieder rückgängig machen muß, z.B. Eieruhr (
crHourGlass) als Cursor auswählen. Am Ende der Prozedur muß der Cursor wieder auf
crDefault gesetzt werden. Problematisch wird es allerdings, wenn man mitten in der Prozedur die Prozedur mit
Exit verlassen will/muß. Hier ein Beispiel mit Cursor, wobei das natürlich auch auf andere Bereiche anwendbar ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); begin Cursor := crHourGlass; if not FileExists('c:\datei.dat') then Exit;
Cursor := crDefault; end; |
Natürlich kann man das nicht so machen, denn hier bleibt die Eieruhr als Cursor. Will man also mitten drin die Prozedur verlassen, dann muß man alle Einstellungen, die man am Ende der Prozedur ausführen möchte, extra wegen des
Exits auch mitten im Block ausführen. Das könnte so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ... if not FileExists('c:\datei.dat') then begin Cursor := crDefault; Exit; end; ... |
Exit verlangt also hin und wieder eine doppelte Pflege. Wenn es nur ein Cursor ist, dann ist es nicht tragisch. Wenn man aber einige
Exits in der Prozedur hat, dann wird diese Art ein wenig lästig.
Besser ist die
try..finally..end Variante. Die ist nicht nur für den Ressourcenschutz gut, sondern sorgt dafür, daß auf jeden Fall immer der
finally Teil ausgeführt wird. Da kann
Exit hundert mal die Prozedur verlassen, das macht sie aber nicht ohne vorher den
finally Teil durchzulaufen. Der obere Code könnte also auch so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); begin Cursor := crHourGlass; try if not FileExists('c:\datei.dat') then Exit;
finally Cursor := crDefault; end; end; |
Ich glaube, daß das ein wenig eleganter ist.
Also,
try..finally kann kann man immer dann einsetzten, wenn irgendwas auf jeden Fall ausgeführt werden soll. Wird der Block zwischen
try und
finally verlassen, dann wird auf jeden Fall noch der Teil zwischen
finally und
end ausgeführt. Hier im Beispiel wird der Cursor immer wieder Default gesetzt; egal ob die Prozedur durchlaufen wird oder vorher verlassen wird.
Moderiert von jasocul: Beitrag geprüft am 08.06.2006