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 2  1 2      
Furtbichler
(Gast)

n/a Beiträge
 
#1

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
 
#2

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
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.307 Beiträge
 
Delphi 12 Athens
 
#3

AW: Try - except - finally

  Alt 30. Sep 2013, 10:04
Wenn Du es 'falsch' angehst: Ja.
Wieder was gelernt
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
idefix2

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

AW: Try - except - finally

  Alt 30. Sep 2013, 10:46
Welchen Sinn es haben soll und inwieweit es "richtiger" sein soll, die finalen Aufräumarbeiten und die Fehlerbehandlung in zwei getrennte Prozeduren zu stecken, wobei eine die andere aufruft, erschliesst sich mir überhaupt nicht (ausser, mit dem Auftraggeber ist ein Zeilenhonorar vereinbart ). Das Programm wird dadurch weder besser lesbar noch übersichtlicher, eher im Gegenteil.

Geändert von idefix2 (30. Sep 2013 um 10:49 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Try - except - finally

  Alt 30. Sep 2013, 11:42
Oftmals wird eine Code-Stelle, an der eine Exception auftritt, gar nicht in der Lage sein, eine Entscheidung zu treffen, wie mit der Situation umgegangen werden soll. In diesem Fall ist sie geradezu gezwungen, die Exception nach draußen zu reichen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Try - except - finally

  Alt 30. Sep 2013, 15:27
Als kleiner Einwurf der hier garantiert niemanden wirklich weiterbringt: In den ersten Tagen (Wochen?) Delphi habe ich mich auch immer wieder daran gerieben, kein try-except-finally zu haben. Um ehrlich zu sein, gefällt mir der Delphi-Weg mittlerweile besser, es ist einfach nur eine Gewöhnungssache.

Mir ist im Nachhinein auch aufgefallen dass wenn mich das rein optisch (von der Einrückung) her anfing zu stören, meine Methoden eh viel zu lang waren.

PS: Wann kommt endlich ARC auf den Desktop? Damit spart man sich wohl endlich 95% aller
Delphi-Quellcode:
Referenz := TObject.Create();
try
  [...]
finally
  Referenz.Destroy();
end;
sparen
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#7

AW: Try - except - finally

  Alt 30. Sep 2013, 15:37
Delphi-Quellcode:
Referenz := TObject.Create();
try
  [...]
finally
  Referenz.Destroy();
end;
sparen
Jetzt mal blöd gefragt,
fliegt Dir das nicht doch noch um die Ohren, wenn die Erzeugung von Referenz fehlschlägt?
Sollte man nicht besser Referenz.Free aufrufen,
denn das prüft doch noch auf <> nil , bevor es destroy aufruft?
Oder denke ich falsch?
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.877 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Try - except - finally

  Alt 30. Sep 2013, 16:15
Ja, .Destroy() sollte man nie direkt aufrufen.
Markus Kinzler
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Try - except - finally

  Alt 30. Sep 2013, 19:18
Delphi-Quellcode:
Referenz := TObject.Create();
try
  [...]
finally
  Referenz.Destroy();
end;
sparen
Jetzt mal blöd gefragt,
fliegt Dir das nicht doch noch um die Ohren, wenn die Erzeugung von Referenz fehlschlägt?
Sollte man nicht besser Referenz.Free aufrufen,
denn das prüft doch noch auf <> nil , bevor es destroy aufruft?
Oder denke ich falsch?
Ich sehe hier kein Problem. Wenn ich in den try-Block reinkomme, war der Konstruktor erfolgreich und es gibt eine gültige Referenz.

Fliegt der Konstruktor bereits raus, wird der try-Block erst garnicht ausgeführt (aber der Destruktor des Objekts aufgerufen).
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Try - except - finally

  Alt 30. Sep 2013, 16:36
Welchen Sinn es haben soll und inwieweit es "richtiger" sein soll, die finalen Aufräumarbeiten und die Fehlerbehandlung in zwei getrennte Prozeduren zu stecken, wobei eine die andere aufruft, erschliesst sich mir überhaupt nicht (ausser, mit dem Auftraggeber ist ein Zeilenhonorar vereinbart ).
Jede Methode soll genau eine Sache machen. Die Beschreibung der Methode sollte kein 'und' enthalten. Wenn doch, sollte man 2x hinschauen, ob man die Methode nicht aufsplitten kann. Kommentare (außer Rechtshinweise, Beschreibung von speziellen Algorithmen und vielleicht Klassenbeschreibungen) sind überflüssig, wenn man seinen Code so schreibt, das er -vorgelesen- genau das beschreibt, was er macht. Und das gelingt nur, wenn man die Methoden so aufdröselt, das sich die Beschreibung einer Methode in ihrem Namen widerspiegelt und sie keine Seiteneffekte hat. Für meine Begriffe ist das die einzige Möglichkeit, Programme zu schreiben, die auch für andere schnell begreifbar sind.

Du kannst natürlich auch alles in eine Methode packen, klar. Das mag bei einem einzeiligen Aufruf (und den einfachen Beispielen hier) noch funktionieren, aber das wird schnell unübersichtlich, wenn Aufräumarbeiten, Fehlerbehandlung usw komplexer werden. Es ist einfacher, sich an dieses oder ein ähnliches Pattern zu halten. Du kannst das natürlich sein lassen und alles in eine Methode packen, ganz wie es Dir gefällt.
  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:58 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