Hi Gemeinde,
Hier wird einem ständig empfohlen, Speicheranforderungen und -freigabe unbedingt immer in Try-Finally-Blöcke zu packen ("Resourcenschutzblöcke")
Ich verstehe den Sinn nur bedingt. Natürlich ist es manchmal sinnvoll, aber eigentlich nur, um einen Securitylayer um eine Methode zu legen, à la:
Delphi-Quellcode:
Procedure TMyClass.QuiteAbstractMethod;
Begin
helper := THelper.Create;
Try
Try
helper.Perform;
performSomethingMore;
finally
helper.free
end;
Except
On E:
Exception Do Begin
UndoWhateverHappened;
MapExceptionToAbstractLayer(E)
End;
End;
End;
Hier werden Exceptions einer tieferen Ebene so behandelt, das erstens die Methode nach außen hin keinen Schaden anrichtet und zweitens die sehr spezifischen Exceptions der tieferen Ebene in abstraktere Exceptions gemappt werden. Es interessiert z.B. den Anwender einer abstrakten Verbindungskomponente herzlich wenig, das die
TCP/
IP-Addresse nicht aufgelöst werden kann, schließlich weiß er gar nicht, das die Verbindung heute mal über
TCP hergestellt wird.
Die Helper-Methode "Perform" wäre nach genau dem gleichen Muster gestrickt.
Kennt jemand noch andere sinnvolle Beispiele, wo ein "Resourcenschutzblock" wirklich nötig ist?
Versteht mich bitte nicht falsch, ich bau die Dinger seit Jahren automatisch ein, aber langsam nerven die Teile, denn sie machen den Code unübersichtlich und sind zum größten Teil überflüssig:
Delphi-Quellcode:
Procedure TMyForm.Button1Click (Sender : TObject);
Var
B : TSomething;
Begin
B := TSomething.Create;
Try
B.Work;
Finally
B.Free
End
End;
Ich meine, wenn es hier knallt, hab ich einfach etwas falsch gemacht. Im Umkehrschluss benötige ich also kein Try-Finally, wenn ich alles richtig gemacht habe.
Bevor man hier mit weiteren Beispielen kommt, bitte nachdenken, ob es sich nicht um o.g. Securitylayer-Implementierungen handelt...
Das Bild hängt schief.