AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

unterschied except finally?

Ein Thema von Marco Steinebach · begonnen am 22. Jun 2008 · letzter Beitrag vom 23. Jun 2008
Antwort Antwort
Seite 1 von 2  1 2      
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#1

unterschied except finally?

  Alt 22. Jun 2008, 20:39
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Noinini
Noinini

Registriert seit: 12. Aug 2003
Ort: Kempen
38 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: unterschied except finally?

  Alt 22. Jun 2008, 20:41
Hi Marco,

ganz einfach:
finally wird immer durchlaufen
except ausschließlich, wenn ein Fehler aufgetreten ist...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: unterschied except finally?

  Alt 22. Jun 2008, 20:42
Der Except-Abschnitt ist nicht für Aufräumarbeiten gedacht sondern für Fehlerbehandlungen (z.B. E-Mailbenachrichtigung)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: unterschied except finally?

  Alt 22. Jun 2008, 20:47
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Noinini
Noinini

Registriert seit: 12. Aug 2003
Ort: Kempen
38 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: unterschied except finally?

  Alt 22. Jun 2008, 20:55
Fast, aber vielleicht verstehen wir auch was Unterschiedliches unter "Aufräumen"
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.
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: unterschied except finally?

  Alt 22. Jun 2008, 21:00
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;
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: unterschied except finally?

  Alt 22. Jun 2008, 21:07
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
Marco Steinebach
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: unterschied except finally?

  Alt 22. Jun 2008, 21:09
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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: unterschied except finally?

  Alt 22. Jun 2008, 21:49
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: unterschied except finally?

  Alt 23. Jun 2008, 08:27
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?
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz