Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: try ... except --> wann verwenden ???

  Alt 1. Aug 2007, 13:05
Ich finde, man sollte Try ... Except Blöcke dann verwenden, wenn im Normalfall nichts passiert, aber eine Ausnahme (nichts anderes bedeutet ja 'Exception') gesondert behandelt werden sollte.

Zitat von Matze:
ich würde es da nutzen, wo Fehleingaben vom Benutzer Fehler verursachen würden bzw. allgemein da, wo Fehler leicht auftreten können. Wenn möglich solltest du jedoch try-except weitmöglich umgehen und lieber per if-Abfragen prüfen, ob etwas funktioniert hat oder nicht, finde ich. Das ist je nach Situation natürlich unterschiedlich.
Grausam, dabei kommt sehr unübersichtlicher Code heraus:
Delphi-Quellcode:
If ActionA=aSuccess Then
  If ActionB = Success Then
    If ActionC = Success Then
      If ActionD = Success Then
         .....
      else
        ....
   else
 ...
Oder auch
Delphi-Quellcode:
aResult := ActionA;
If aResult<>Success Then Exit;
aResult := ActionB;
If aResult<>Success Then Exit;
aResult := ActionC;
If aResult<>Success Then Exit;
aResult := ActionD;
If aResult<>Success Then Exit;
vs.
Delphi-Quellcode:
Try
  ActionA;
  ActionB;
  ActionC;
  ActionD;
Except
  Raise Exception.Create('Bei der Abarbeitung der Aktionen ist ein Fehler aufgetreten');
End;
Also, schreib mal übersichtlicheren und robusten Code ohne Try...Except.

Es ist natürlich beim Design und Debuggen etwas nervig, wenn einem Exceptions um die Ohren fliegen. Aber erstens kann man das ausschalten und zweitens ist es ja eine Ausnahme, die eben nur in Ausnahmefällen vorkommen sollte.

Programmfehler würde ich mit Assert-Anweisungen vermeiden, Logische Prüfungen von Eingaben vermutlich über einen Parser / DEA analysieren und bei einem Fehler eine Exception 'EUserInputException' schmeissen, die die genaue Ursache und Position beinhaltet.

Zum Beispiel vom Dezipaitor. Variante A (Wenn der Fehler weitergereicht werden soll);
Delphi-Quellcode:
MyOBject:= TMyObject.Create;
Try
  Try
    MyObject.CriticalMethod;
  Except
    On E:ESomeException Do Begin
      HandleSomeException (E);
      Raise
    End
  End
Finally
  MyObject.Free;
End;
Und wenn nicht:
Delphi-Quellcode:
MyObject:= TMyObject.Create;
Try
  MyObject.CriticalMethod;
Except
  On E:ESomeException Do
    HandleSomeException (E);
End;
MyObject.Free;
Letzteres ist die sog. 'Halts Maul' Variante, die man durch einen überflüssigen Try..Finally Block kapseln kann:
Delphi-Quellcode:
MyObject:= TMyObject.Create;
Try
  Try
    MyObject.CriticalMethod;
  Except
    On E:ESomeException Do
      HandleSomeException (E);
  End;
Finally
  MyObject.Free;
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat