![]() |
Re: try .. except .. finally
Hier mal meine Meinung:
Delphi-Quellcode:
:arrow: In so einem Fall braucht man das finally, da man ja Exceptions re-raisen kann ("Soll sich doch wer anderes damit rumschlagen")
begin
ppFile := TNativeXml.CreateName('xyz'); try try [...] except on e: EMySQLException do AddLogAlert('Fehler' + ppFile.ErrorMessage); on e: Exception do begin AddLogAlert('Fehler' + e.ErrorMessage); raise; end; end; finally ppFile.Free; end; end; :arrow: finally nach except, damit man im Except noch auf das Objekt zugreifen kann (und evtl. Infos heraauszuholen |
Re: try .. except .. finally
Zitat:
Ehrlich gesagt, fände ich es auch praktisch und lesbarer. Die Reihenfolge (erst except, dann finally) würde man nicht versehentlich verdrehen. Und wenn der Bereich Exceptionbehandlung eine Vereinfachung erhält, werden mehr Entwickler auf dieses Sprachfeature aufmerksam. Viele Entwickler nutzen Exceptions nicht und benutzen Returncodes zur Fehlerbehandlung (if MyFileSize < 0 then IrgendwasSeltsamesIstGeschehen). Cheers, |
Re: try .. except .. finally
Hi,
Zitat:
und später schreibst du: Zitat:
Grüße Ansgar |
Re: try .. except .. finally
Moin Zusammen,
um es mal allgemein zu schreiben (wenn man denn einen try/except-Block braucht:
Delphi-Quellcode:
Da es in dem konkreten Fall darum geht, dass eine Datei evtl. gesperrt ist, wäre es allerdings besser dies zu prüfen (z.B. durch den Versuch diese mit CreateFile exklusiv zu öffnen), und den Programmablauf an das Ergebnis der Prüfung anzupassen.
try
<Resource belegen> try <Mit der Resource arbeiten> finally <Resource freigeben> end; except <Ausnahme behandeln> end; Mit try/except sollte man nur dann arbeiten, wenn es wirklich nicht anders geht. |
Re: try .. except .. finally
@angos: Sorry, dann hatte ich das falsch verstanden, ich hatte das "richtig herum" auf die Verschachtelung except/finally bezogen.
Zitat:
|
Re: try .. except .. finally
Zitat:
Delphi-Quellcode:
var
SL: TStrings; S: string; begin try // Resource belegen SL := TStringlist.Create; try // Mit der Resource arbeiten S := SL[1]; finally // Resource freigeben FreeAndNil(SL); end; except // Ausnahme behandeln on E:Exception do begin ShowMessage(E.Message + Format(' - S hat %d Elemente', [SL.Count])); end; end; end; |
Re: try .. except .. finally
Das Problem was hier vorliegt: Du unterscheidest nicht, welche Exception aufgetreten ist. Du gehst in deinem Except Block fest davon aus, dass es ein Bereichsfehler/Indexfehler ist. Was aber wenn der Speichermanager das Create gar nicht durchführen konnte? Dann ist deine SL Variable so oder so im Eimer, egal wie rum except und finally stehen.
Grundlegend: Ich würde niemals mit Objekten in einem Exception Abschnitt arbeiten aus dem geschützten/umfassten Codebereich. Wenn gibt es Exceptions welche zusätzliche Informationen tragen bzw. tragen können. Aber ein Zugriff auf die Objekte aus dem geschützten Bereich im Exception - Behandlungsbereich ist nicht sicherer als innerhalb des Blockes. Eine Exception ist eine definitive Ausnahmesituation. Wenn bei dir die Küche brennt willst du dir bestimmt auch nicht vorher nochmal in Ruhe die Hände waschen bevor du dein Telefon anfässt um die Feuerwehr zu rufen - nur weil du es sonst auch immer machst (um dein Handy sauber zu halten). Wenn eine Ausnahmesituation auftritt, dann benutze verlässliche Quellen und das ist in diesem Falle die Exception selbst. Zitat:
|
Re: try .. except .. finally
Zitat:
Ob die Reihenfolge try ... finally ... except ... end oder try ... except ... finally ... end verwendet wird, macht daher schon einen Unterschied. C# und Java zum Beispel kennen nur try catch finally. Also erst "die Feuerwehr rufen", nicht als letztes. |
Re: try .. except .. finally
Moin Muetze,
Zitat:
Zudem dauert die Verarbeitung einer Exception IMHO relativ lange, und wenn man sich erst einmal daran gewöhnt hat alle möglichen Fehlerbedingungen nicht selber zu prüfen, könnte es sich auch negativ auf das Laufzeitverhalten auswirken. |
Re: try .. except .. finally
Zitat:
Manchmal ist eine Behandlung eines Fehlers auch nicht allgemeingültig möglich, z.B. wenn die gleiche Funktion mal in einer GUI, in einem Batchjob oder einem Webservice verwendet wird. Statt
Delphi-Quellcode:
kann man dann einfach die Exception werfen und die konkrete Anwendung der Funktion entscheidet, wie sie mit der Fehlersituation umgehen möchte.
if GUIVorhanden then Benutzerfragen ... else
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 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-2025 by Thomas Breitkreuz