Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi unterschied except finally? (https://www.delphipraxis.net/116060-unterschied-except-finally.html)

Marco Steinebach 22. Jun 2008 21:39


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:
try
MachWas;
Finally
Aufraeumen;
end;
und
Delphi-Quellcode:
try
MachWas;
except
Aufraeumen;
end;
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 ...
Etwas ratlose Grüße
Marco

Noinini 22. Jun 2008 21:41

Re: unterschied except finally?
 
Hi Marco,

ganz einfach:
finally wird immer durchlaufen
except ausschließlich, wenn ein Fehler aufgetreten ist...

Bernhard Geyer 22. Jun 2008 21:42

Re: unterschied except finally?
 
Der Except-Abschnitt ist nicht für Aufräumarbeiten gedacht sondern für Fehlerbehandlungen (z.B. E-Mailbenachrichtigung)

Marco Steinebach 22. Jun 2008 21:47

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

Noinini 22. Jun 2008 21:55

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.

Fussball-Robby 22. Jun 2008 22:00

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;

Marco Steinebach 22. Jun 2008 22:07

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

Assertor 22. Jun 2008 22:09

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:
Objekt := TObjekt.Create;
try
  try
    Objekt.DoFoo;
  except
    ...
  end;
finally
  Objekt.Free;
end;
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.

z.B. Wenn EMeineException von EMeineAllgemeineExceptionklasse ableitet:
Delphi-Quellcode:
try
  ...
  DoSomethg;
  // hier löst etwas EMeineException aus
  ...
except
  On E:EMeineAllgemeineExceptionklasse do
    Raise;
  On E:EMeineException do
  begin
    // eat my errors
  end;
end;
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...

Mal als Hilfe zum Thema:
Exception Handling for Fun and Profit (Codegear)
Ten Things (or more) You Might Not Know About Exception Handling in Delphi
Was für Anfänger

Gruß Assertor

SirThornberry 22. Jun 2008 22:49

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:
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.

RavenIV 23. Jun 2008 09:27

Re: unterschied except finally?
 
Zitat:

Zitat von SirThornberry
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');

Kann es sein, dass Du diese beiden Fälle gerade verwechselt hast?
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 17:39 Uhr.
Seite 1 von 2  1 2      

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