AGB  ·  Datenschutz  ·  Impressum  







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

Try - except - finally

Ein Thema von idefix2 · begonnen am 29. Sep 2013 · letzter Beitrag vom 1. Okt 2013
Antwort Antwort
Seite 1 von 3  1 23      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Try - except - finally

  Alt 29. Sep 2013, 22:47
Ich finde es ungeheuer irritierend, dass die Except Klausel und die finally Klausel nicht gleichzeitig zu einem Try verwendet werden können.
Wie handhabt ihr es, wenn als Folge einer Exception Aktionen erfolgen müssen, und am Schluss aufgeräumt werden muss, egal ob eine Exception aufgetreten ist oder nicht. Zwei geschachtelte Try Try ... except ... raise end finally ... end?

Geändert von idefix2 (30. Sep 2013 um 01:04 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Try - except - finally

  Alt 29. Sep 2013, 23:06
Ja, warum nicht? Passiert ja nicht oft, das man in ein und derselben Routine sowohl einen Resourcenschutzblock als auch eine ordentliche Fehlerbehandlung implementiert.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

AW: Try - except - finally

  Alt 30. Sep 2013, 07:53
Da wird man wohl diese Sprachunschönheit akzeptieren müssen und doppelt aufbauen

Delphi-Quellcode:
try
  try
  except
finally
Wäre schön wenn man das im Rahmen der LLVM-Compilers korrigieren könnte und auch
Delphi-Quellcode:
try
except
finally
wie in anderen modernen Sprachen auch schreiben könnte.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Try - except - finally

  Alt 30. Sep 2013, 08:51
Habe ich mir nie gedanken drüber gemacht.

Ist ein except nicht irgendwie ein finally.

Alles was nach dem except-Block kommt, wird doch abgearbeitet, da die Fehler ja im Exceptblock abgefangen werden.

Free wird doch bei beiden Funktionen aufgerufen und somit ist doch alles schön aufgeräumt.

Delphi-Quellcode:
begin
  sl:=TStringlist.create;
  try
    EineFehlerhafteProcedure
  except
    // hier eine schöne Fehlermeldung
  end;
  sl.free;
end;
Delphi-Quellcode:
begin
  sl:=TStringlist.create;
  try
    EineFehlerhafteProcedure
  finally
    sl.free;
  end;
end;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

AW: Try - except - finally

  Alt 30. Sep 2013, 09:01
Free wird doch bei beiden Funktionen aufgerufen und somit ist doch alles schön aufgeräumt.
Nein. Wenn eine weitere Exception im Exceptionblock auftritt nicht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Try - except - finally

  Alt 30. Sep 2013, 09:04
Free wird doch bei beiden Funktionen aufgerufen und somit ist doch alles schön aufgeräumt.
Nein. Wenn eine weitere Exception im Exceptionblock auftritt nicht.
Und wenn die weitere Exception im finallyblock auftritt? Dann schon?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Try - except - finally

  Alt 30. Sep 2013, 09:05
Free wird doch bei beiden Funktionen aufgerufen und somit ist doch alles schön aufgeräumt.
Nein. Wenn eine weitere Exception im Exceptionblock auftritt nicht.
Richtig, oder wenn die gefangene Exception nur protokolliert, und dann mit raise weitergegeben wird - ein nicht unübliches Vorgehen
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Try - except - finally

  Alt 30. Sep 2013, 09:07
Free wird doch bei beiden Funktionen aufgerufen und somit ist doch alles schön aufgeräumt.
Nein. Wenn eine weitere Exception im Exceptionblock auftritt nicht.
Und wenn die weitere Exception im finallyblock auftritt? Dann schon?
Nur wenn die weitere Exception nach dem Free auftritt. Tritt sie vor dem Free auf, wird die Funktion mit der Exception abgebrochen, und das Free nicht ausgeführt.
Michael Justin
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Try - except - finally

  Alt 30. Sep 2013, 09:14
Da wird man wohl diese Sprachunschönheit akzeptieren müssen und doppelt aufbauen
Das ist Geschmackssache. In C# gehts auch nicht und das ist auch OK so (imho). Die Abstraktionsniveaus passen bei 'try-finally' und 'try..except' sowieso nicht, ergo ist es eh ein Designflaw, das in eine Methode zu packen, aber das mal nur nebenbei.

Ist ein except nicht irgendwie ein finally.
Wenn Du es 'falsch' angehst: Ja.
Das 'Try-Except' benötigst Du, um etwaige Ausnahmen/Fehler zu kapseln und das Abstraktionsniveau anzuheben. Allgemein sieht das so aus:
Delphi-Quellcode:
procedure TMyClass.Action();
begin
  try
    DoSomething();
  except
    on e:ESomethingException do
      raise new EActionException.Create (TranslateExpectedException(e));
    on e:Exception do
      raise new EActionException.Create (TranslateUnexpectedExpectedException(e));
  end
end;
D.h. Du fängst die Exceptions ab und übersetzt sie so, das der Aufrufer der Methode 'Action' etwas damit anfangen kann. Z.B. kapselst Du Fehlermeldungen beim Verbindungsaufbau der DB (TCP-, Named-Pipe-, Server-, Hardware-, Login- Fehler in eine abstraktere 'EActionFailed'- Exception. Denn den Aufrufer interessiert es nicht, was da hinter der Fassade vor sich geht und ob es eine EADOException, EOracleException, ETCPException, EIdException etc. ist.

Allgemein gesehen transformierst Du die Exception und reichst sie durch. In Sonderfällen, wenn z.B. die Exception einfach eine Ausnahme von der Regel ist, oder wenn die Exception 'repariert' werden kann, würdest Du die Exception nicht weiterreichen bzw. transformieren.

Damit ist klar, das dein Gleichsetzen nur in Ausnahmefällen zutreffen würde. Aus Gründen der Übersichtlichkeit würde ich jedoch *immer* ein explizites 'try-finally' umsetzen. Dann ist einfach sonnenklar, das es sich um einen resourcenschutzblock handelt.

Delphi-Quellcode:
Procedure TMyClass.Action(); // Public !
Begin
  Try
    InnerAction();
  Except
    on e:ESomethingException do
      raise new EActionException.Create (TranslateExpectedException(e));
    on e:Exception do
      raise new EActionException.Create (TranslateUnexpectedExpectedException(e));
  end
end;

Procedure TMyClass.InnerAction(); // private oder protected !!
begin
  Stuff.Acquire();
  try
    DoSomething(Stuff);
  Finally
    Stuff.Release();
  End
End;
Nun kann man in 'Action' entscheiden, ob man reparieren kann, oder nicht.
Es geht natürlich auch umgekehrt:

Delphi-Quellcode:
Procedure TMyClass.Action(); // Public !
Begin
  Stuff.Acquire();
  Try
    InnerAction(Stuff);
  Finally
    Stuff.Release();
  End
end;

Procedure TMyClass.InnerAction(Stuff : TStuff); // private oder protected !!
begin
  try
    DoSomething(Stuff);
  Except
    on e:ESomethingException do
      raise new EActionException.Create (TranslateExpectedException(e));
    on e:Exception do
      raise new EActionException.Create (TranslateUnexpectedExpectedException(e));
  end
End;
Meist wird man die erste Variante ('Unit of Work') verwenden. Bei der zweiten Variante ist ja nicht sichergestellt, das 'Stuff' korrekt initialisiert ist (das müsste ggf. sichergestellt werden). Allerdings könnte die 2. Variante bei Reparaturversuchen sinnvoll sein. Kommt immer auf den Fall an.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

AW: Try - except - finally

  Alt 30. Sep 2013, 09:49
Das ist Geschmackssache. In C# gehts auch nicht und das ist auch OK so (imho).
kleiner Einwurf: doch, in C# gibt es soetwas. Doku: http://msdn.microsoft.com/de-de/libr...v=vs.110).aspx

Man kann auch das praktische using() in Verbindung mit try-catch benutzen, falls anwendbar.

Geändert von jfheins (30. Sep 2013 um 09:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 14:40 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