![]() |
Delphi-Version: 10.2 Tokyo
Was würdet ihr von einem try-except-finally-Konstrukt halten?
Moin!
Wenn ich mir verschiedene Quellen so anschaue, insbesondere wenn man mit Datenbanken zu tun hat, fällt mir immer wieder auf wie sperrig das Exception-Handling eigentlich ist:
Delphi-Quellcode:
Und man muss sich drauf verlassen, dass die Transaction nicht auch noch zwischen dem Rollback und dem Commit zufällig anderswo eine Transaction gestartet hat. Um auf Nummer sicher zu gehen, gibts die mitlaufende boolsche Variable. Wie elegant wäre da sowas:
myBoolAllesOk := False;
try try myTransaction.StartTransaction; myDB.TuWas; myBoolAllesOk := True; except on E: EIrgendwas do myTransaction.Rollback; end; finally if myBoolAllesOk then myTransaction.Commit; end;
Delphi-Quellcode:
Soweit ich das überblicken kann ließe sich eine solche Spracherweiterung problemlos einbauen weil es rückwärtskompatibel wäre.
try
myTransaction.StartTransaction; myDB.TuWas; except on E: EIrgendwas do myTransaction.Rollback; finally myTransaction.Commit; end; Was haltet ihr davon? Grüße Cody |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Ja, so ein Konstrukt wäre sinnvoll,
aber warum nicht so?
Code:
try
myTransaction.StartTransaction; myDB.TuWas; myTransaction.Commit; except on E: EIrgendwas do myTransaction.Rollback; end; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Das war nur ein Pseudocode-Beispiel wie es in der Praxis oft vorkommt und sich viele was drunter vorstellen können. Anstatt der Transaction kann an sich auch irgend ein Object-Create-Free vorstellen.
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Eher
Delphi-Quellcode:
try
o := TKlasse.Create; TuWas; except on E: EIrgendwas do FehlerBearbeitung; finally o.Free; end; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Oder noch eher:
Delphi-Quellcode:
o := TKlasse.Create;
try TuWas; except on E: EIrgendwas do FehlerBearbeitung; finally o.Free; end; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Also Idee gut, Beispiel Mist?
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zu dieser Idee gibt es schon einige Threads, da müssten eigentlich sämtliche Pros und Contras erörtert worden sein.
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Die nächste Steigerungsstufe wäre dann:
Delphi-Quellcode:
Und das Free kann man sich sparen, weil der Compiler Code erzeugt, mit dem der Destruktor nach dem "End" aufgerufen wird.
// ...
try (Obj := TMyClass.Create) // mach etwas mit dem Objekt ... except // behandele die Exception ... end; // ... 8-) |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Als ich noch hauptsächlich in Java unterwegs war und dann zu Delphi kam war ich auch erstmal baff wie so etwas wie try..except..finally fehlen kann.
Ganz ehrlich: Ich vermisse es nicht im geringsten. Andere Dinge fehlen mir sehr viel mehr. Wenn man es denn wirklich einmal braucht ist ein try..(try..except)..finally allein durch die Einrückung schon übersichtlicher, finde ich. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Ich finde die Idee gut und vermisse das auch in Delphi seit ich vor Jahren das erste Mal in C# damit in Kontakt getreten bin.
Zitat:
Code:
using (HttpClient client)
{ DoSomethingWithClient(client); } |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Wäre eine Überlegung wert, aber dann nicht mehr 100% abwärtskompatibel. Denn stell dir mal vor, du würdest einen bestehenden try-except-Block, wo es schon ein .Free im exception-Abchnitt gibt, um einen finally-Abschnitt nach dem neuen Konzept ergänzen. Wenn du darin dann auch ein .Free machst, kracht es natürlich bei einer Exception, weil das Objekt versucht wird doppelt freizugeben. Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Du musst schon nach
![]() |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Bei einem Fehler im try wird die Ausführung abgebrochen und der Code im except-Block ausgeführt (falls vorhanden). finally wird immer ausgeführt.
Code der nur bei Fehlerfreiheit ausgeführt werden soll, kann man ja einfach in den try-Block packen. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Zitat:
Wenn das try-except-finally dazu da ist, ein Konstrukt wie dieses zu ersetzen, ja. Und nur so ergibt es ja auch Sinn.
Delphi-Quellcode:
o := TKlasse.Create;
try try TuWas; except on E: EIrgendwas do FehlerBearbeitung; end; finally o.Free; end; Der Gewinn ist allerdings nicht gerade üppig. Man spart lediglich ein try, ein end und eine Einrückungsstufe. Ist also lediglich Kosmetik, aber Aussehen ist ja auch manchmal wichtig. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Ich selber verwende fast nur noch interfaced Klassen. Der Bedarf nach finally ist dadurch drastisch gesunken. Habe daher kein Bedarf.
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Also ich fände das gut! Dieses Geschachtel finde ich immer sehr unübersichtlich.
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Was ist denn der Unterschied zwischen
Delphi-Quellcode:
und
Objekt := TKlasse.Create;
try Objekt.MacheEtwas; except on E: EIrgendwas do Fehlerbearbeitung; finally Objekt.Free; end;
Delphi-Quellcode:
?
Objekt := TKlasse.Create;
try Objekt.MacheEtwas; except on E: EIrgendwas do Fehlerbearbeitung; end; Objekt.Free; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Der Unterschied tritt dann auf, wenn in Fehlerbearbeitung eine neue Exception auftritt (entweder durch ein raise oder "aus Versehen")
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Die im except-Fall aufgetretene Exception sollte in beiden Fällen nach oben durchgereicht werden. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Dann gäbe es aber immer noch eine unbehandelte Exception. Dinge, die man im Fehlerfalle macht, sollten keine Exception werfen, oder diese zumindest selbst ordentlich abfangen und verarbeiten. Ich habe nichts gegen ein solches Konstrukt, sehe aber auch nicht, wie es bei sicherer Programmierung notwendig wäre. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
- die abgefangene Exception auf eine eigene Exceptionsklasse ummappen - eine Notfallroutine starten, aber die Exception trotzdem laufen lassen - nur bestimmte Exceptions abfangen und alles andere weiterreichen |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Delphi-Quellcode:
Das wünsche ich mir schon lange :)
with qry:=TUniQuery.Create(nil), frm:=TMyForm.Create(nil) do // oder frm = ...
try qry.Connection := Datenmodul.MeineDB; qry.SQL.Text := 'SELECT bla FROM blubb WHERE fasel'; [...] frm.Machwas; frm.ShowModal; except on E: Exception do Blablubb; finally frm.Free; end; In diesem speziellen Fall (und ner kurzen Procedure) kann man natürlich auch "frm" einfach oben definieren. Aber wenn die Procedure länger wird, geht der Zusammenhang schnell verloren. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Gerade dann wenn zwischen dem try und dem except bzw. dem finally viel Quelltext steht, wenn sich innerhalb dessen noch ein paar try-Blöcke aufhalten, dann wird es schon recht unübersichtlich. Und auf das Problem als solches aufmerksam wurde ich, weil ich genau den Fall hatte wie im Eingangspost beschrieben: Eine Transaction sollte ein Rollback im Except-Fall machen und ein Commit im Finally-Fall. Allerdings musste ich das durch einen boolschen "Nebenläufer" absichern.
Zitat:
Das möchte ich auch noch mal betonen: Mir geht es vorrangig um die Lesbarkeit, was nicht gleichbedeutend ist mit möglichst kompaktem Code. Dass try-except-finally zu weniger Codezeilen führt ist eher ein unbeabsichtigter Nebeneffekt. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Delphi-Quellcode:
...Satan weiche! :warn: Wie schon immer berichtet nimmst du mit with dir die Debugging Möglichkeiten...vom Scope-Fehler mal abgesehen. :roll:
with qry:=TUniQuery.Create(nil), frm:=TMyForm.Create(nil) do // oder frm = ...
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
Es geht ganz ohne "Nebenläufer":
Delphi-Quellcode:
BeginTransaction;
try MachWasMitDerDatenbank; CommitTransaction; except RollbackTransaction; end; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zumal mir an dem gegebenen Beispiel nicht so ganz klar wird, wofür das with hier überhaupt gebraucht wird, da beide Elemente (qry und frm) benannt sind und auch als benannte Elemente verwendet werden. Genau genommen hat man auf diese Weise eine Zeile gespart und zwei Keywords hinzugefügt. Aber wie gesagt, das ist ein Thema für sich.
Zitat:
Delphi-Quellcode:
qry:=TUniQuery.Create(nil); frm:=TMyForm.Create(nil); // oder frm = ...
try qry.Connection := Datenmodul.MeineDB; qry.SQL.Text := 'SELECT bla FROM blubb WHERE fasel'; [...] frm.Machwas; frm.ShowModal; except on E: Exception do Blablubb; finally frm.Free; end; |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Bitte nicht am eigentlich eher als deprecatet gekennzeichneten with Konstrukt noch erweiterungen vornehmen lassen. Sonst geht dir noch Nick Hodges nach, wenn er erfährt, dass du der vorschlagende warst! ;-)
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Es gäbe für so ein Konstrukt sicherlich den ein oder anderen Anwendungsfall. Aber wie der ein oder andere schon geschrieben hat, is das eher die Kategorie "nice to have", aber nicht "must have" :)
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Nein, die fallen eher in die gleiche Kategorie wie "with". Dinge die die Lesbarkeit von Code einfach nur unübersichtlich machen (Über anonyme Funktionen lass ich mich jetzt lieber nicht aus :) ).
Dein Konstrukt würde aber, mindestens, die Übersichtlichkeit vom Code erhöhen :) |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Ich würds ja gerne als Feature Request an Emba schicken, aber auf der
![]() Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
|
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Also ich habe bei einigen Projekten viel mit JavaScript und jQuery zu tun. Die haben ja die anonymen Methoden zur Philosophie gemacht. Dort habe ich schon Codes mit 30 Verschachtelungsebenen gesehen. Da weiß man bei den ganzen asynchronen Abläufen irgendwann nicht mehr wann was wie abgearbeitet wird.
Sagen wir mal so: Anonyme Prozeduren sind nicht per se schlecht, fördern aber schlechten und unübersichtlichen Code. Quasi das Wasser zum Kochen von Spaghetticode. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Zitat:
So wie mit jedem Tool kann man auch mit Anonymen Methoden schlechten bzw. schwer lesbaren Code schreiben. Wer sowas macht, braucht dazu aber vermutlich auch gar keine Anonymen Methoden, der kriegt das auch so hin. Dinge nur deswegen zu verteufeln, weil manche damit nicht richtig umgehen können, ist meiner Meinung nach auch nicht zielführend. Besser wäre es, den richtigen Umgang damit zu vermitteln - auch wenn das vielleicht nicht bei allen gelingt. |
AW: Was würdet ihr von einem try-except-finally-Konstrukt halten?
Sagen wir mal so: Ich habe schon sehr früh angefangen, Quellcodes nicht nur für mich zu schreiben sondern auch anderen zu zeigen. Daraus bekommt man viel Feedback zum Thema Lesbarkeit (deswegen ich es auch gut finde dass es jetzt die Delphi CE mit RTL- und VCL-Sourcen gibt).
Wenn ich aber Fremdcode sehe, der von Berlin nach Potsdam über München, Hamburg, Stuttgart, Dresden und Düsseldorf fährt, dann ist mir das ein Graus. Davon gibts für mich nur noch eine Steigerungsform, nämlich wenn mich Sprach- bzw. Syntaxeigenschaften selbst zu solchen Umwegen zwingen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz