![]() |
unterschied except finally?
Hallo Listers,
Entweder ist's hier zu schwühl, oder ich steh auf dem Schlauch ... Tun die beiden folgenden Code-Abschnitte nicht das gleiche, und wenn nicht, warum nicht?
Delphi-Quellcode:
und
try
MachWas; Finally Aufraeumen; end;
Delphi-Quellcode:
Mir ist schon klar wofür das ganze Zeug ist, aber wo ist der eigentliche Unterschied? Bei finally steht, wird auf jedenfall durchlaufen, auch wenn ein fehler auftritt, aber das wird der except-Block in meinem zweiten Beispiel doch auch ...
try
MachWas; except Aufraeumen; end; Etwas ratlose Grüße Marco |
Re: unterschied except finally?
Hi Marco,
ganz einfach: finally wird immer durchlaufen except ausschließlich, wenn ein Fehler aufgetreten ist... |
Re: unterschied except finally?
Der Except-Abschnitt ist nicht für Aufräumarbeiten gedacht sondern für Fehlerbehandlungen (z.B. E-Mailbenachrichtigung)
|
Re: unterschied except finally?
Hallo Noinini und Bernhard,
Also heißt daß, wenn ich keine explizite Fehlerbehandlung machen will, nehme ich finally, sonst except und räume am ende von try-except auf, richtig? Viele Grüße Marco |
Re: unterschied except finally?
Fast, aber vielleicht verstehen wir auch was Unterschiedliches unter "Aufräumen" :-D
Alles, was aufgeräumt werden soll - Objekte freigeben, Daten zurücksetzen, was auch immer, gehört ins finally. Weil es immer ausgeführt wird, egal, ob vorher ein Fehler aufgetreten ist oder nicht. Wenn Du eine Fehlerbehandlung brauchst, z.B. Mitloggen, Message ausgeben, etc., dann benutzt Du das except. |
Re: unterschied except finally?
Kleines Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Bmp: TBitmap; begin Bmp := TBitmap.Create; try try Bmp.Width := StrToInt('Hier gibts ne Exception :-)'); except ShowMessage('Der Fehler ist aufgetreten!'); //das hier wird nur bei einem Fehler aufgerufen end; finally Bmp.Free; //wird immer aufgerufen, hier sollten z.B. Objekte freigegeben werden end; end; |
Re: unterschied except finally?
Hallo Noinini und Robert,
jep! That's it! Ich brauchte nämlich wirklich beides, wie in Robert's Beispiel - und bin schlicht nicht auf die Idee gekommen, die Try's zu verschachteln. Vielen Dank und 'nen schönen Abend! Marco |
Re: unterschied except finally?
Hi,
- try-finally dient dazu, einen definierten Zustand zu erhalten. Das sind i.d.R. Objekte, die zwingend nach Erledigung freizugeben sind. - try-except hilft bei der Fehlerbehandlung Am schönsten ist die Kombination:
Delphi-Quellcode:
Bei der Exceptionbehandlung ist noch wichtig, das die Reihenfolge der Exceptions bedacht werden muß. Leitet eine Exception z.B. von einem anderen, generellen Exceptiontyp ab, greift auch hier die Vererbung.
Objekt := TObjekt.Create;
try try Objekt.DoFoo; except ... end; finally Objekt.Free; end; z.B. Wenn EMeineException von EMeineAllgemeineExceptionklasse ableitet:
Delphi-Quellcode:
So, wer jetzt denkt, daß im Exception-Handler EMeineException nicht re-raised wird, der irrt. Denn EMeineException leitet von EMeineAllgemeineExceptionklasse ab und wird somit zuerst behandelt...
try
... DoSomethg; // hier löst etwas EMeineException aus ... except On E:EMeineAllgemeineExceptionklasse do Raise; On E:EMeineException do begin // eat my errors end; end; Mal als Hilfe zum Thema: ![]() ![]() ![]() Gruß Assertor |
Re: unterschied except finally?
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:
eben aus diesem Grund verwende ich in aller Regel:
try
raise Exception.Create('ein Fehler'); except showmessage('wird bei Fehler ausgeführt'); end; showmessage('wird immer ausgeführt');
Delphi-Quellcode:
Hier ein Beispiel wo ich die Verwendung von Finally ungünstig finde:
Object_Erzeugen();
try //Irgendwas testen, wenns klappt gut, wenn nicht, auch kein Beinbruch except //wenns fehlgeschlagen ist - workarround end; Object_Freigeben();
Delphi-Quellcode:
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.
function IsServerAvailable(): Boolean;
begin //check if connection to server is available end; Ä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. |
Re: unterschied except finally?
Zitat:
Eigentlich wird die umgebende Funktion/Procedure beendet, wenn ein Fehler auftritt und der Code in den except-Zweig läuft. Bei finally wird aufgeräumt und anschliessend geht es normal im Code weiter. Oder etwa nicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 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