Bei der Betrachtung der Unterschiede von Try-Finally und Try-Except sollte auch das außerhalb dieser Blöcke beachtet werden:
Delphi-Quellcode:
try
raise Exception.Create('
ein Fehler');
finally
showmessage('
wird immer ausgeführt');
end;
showmessage('
wird nur ausgeführt wenn kein Fehler auftrat');
Delphi-Quellcode:
try
raise Exception.Create('
ein Fehler');
except
showmessage('
wird bei Fehler ausgeführt');
end;
showmessage('
wird immer ausgeführt');
eben aus diesem Grund verwende ich in aller Regel:
Delphi-Quellcode:
Object_Erzeugen();
try
//Irgendwas testen, wenns klappt gut, wenn nicht, auch kein Beinbruch
except
//wenns fehlgeschlagen ist - workarround
end;
Object_Freigeben();
Hier ein Beispiel wo ich die Verwendung von Finally ungünstig finde:
Delphi-Quellcode:
function IsServerAvailable(): Boolean;
begin
//check if connection to server is available
end;
Tritt beim Verbindungsversuch jetzt ein Fehler auf und es wird mit finally gearbeitet so wird die
Exception aus der Funktion raus gereicht. Das heißt man müsste um den Funktionsaufruf auch einen try-** Block packen. Da die Funktion aber eben berücksichtigen sollte das auch ein Verbindungsfehler auftreten kann bin ich der Meinung das hier nicht eine
Exception nach außen gereicht werden sollte sondern die
Exception innerhalb der Funktion geschluckt werden soll und über den Rückgabewert das ganze erledigt werden sollte.
Ähnlich wäre es bei TryStrToInt - dort wäre man auch alles andere als erfreut wenn eine
Exception bei der Wandlung zusätzlich nach außen gereicht werden sollte.
Finally halte ich dann für Sinnvoll wenn der Nutzer Eingaben macht und durch falsche Eingaben etwas schief geht. Denn dann wird der Nutzer über seinen Fehler benachrichtigt.