Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bubblen Exceptions nach oben durch einen try-finally-Block? (https://www.delphipraxis.net/86262-bubblen-exceptions-nach-oben-durch-einen-try-finally-block.html)

Elvis 11. Feb 2007 22:38

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Das finally wird keine Exception schlucken, aber es wird trotzdem ausgeführt.
Aber die große Frage ist, warum du die Exception an der Stelle auf eine so fiese Art schlucken willst?
Solche Art von Code sollte IMHO nur dann Exceptions schlucken, wenn sie recoverable sind, also wenn die App nach Ablauf der Funktion immer noch in einem konsistenten Zustand ist.
Ein Beispiel wäre eine disconnected gracefully mit einem folgendem Reconnect.
Wenn du eine Datei erzeugen willst, dies aber nicht möglich ist, kann sich deine Methode schlecht von dieser Ausnahme erholen. Sie hat also IMHO kein Recht die Ausnahme zu schlucken.
Nur der Code, der die Funktion ausführt, kann das beurteilen.
Und dann vielleicht auch den Benutzer benachrichtigen.

PaulJr 11. Feb 2007 22:45

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Tja… da hast Du wirklich Recht.

Ich habe nur probiert Dein Konstrukt zu Recht zu biegen.

Es geht dies z.B. auch so wie Dir Luckie jetzt gerade gezeigt hat (Hallo Lucke :-D )

In meinem Konstrukt wollte ich Dich nur auf die wichtigste Tatsache aufmerksam machen, dass man NIE die Routine FREE aufruft ohne vorher den Pointer zu überprüfen, da falls NIL dann hast Du ein echtes Problem.

Gruß

PaulJr.

Luckie 11. Feb 2007 22:49

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Zitat:

Zitat von PaulJr
dass man NIE die Routine FREE aufruft ohne vorher den Pointer zu überprüfen, da falls NIL dann hast Du ein echtes Problem.

Nein hat er nicht, da Free vorher auf nil prüft und nur dann den Destruktor aufruft, wenn da Objekt nicht nil ist:
Zitat:

Free automatically calls the destructor if the object reference is not nil. [..] Unlike Destroy, Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error.
Zitat:

Zitat von PaulJr
(Hallo Lucke :-D )

Ähm, ich stehe gerade etwas auf dem Schlauch... Allerdings kommt mir der Nick PaulJr irgendwie bekannt vor. :gruebel:

PaulJr 11. Feb 2007 22:51

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Habe natürlich Luckie :???: gemeint. Ja ich bin der "alte" PaulJr.

Gruß

PaulJr.

P.S.

Ich meinte Luckie nicht Deine Routine (die ist OK!)sondern das was er programmiert hatte...

Elvis 11. Feb 2007 22:57

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Zitat:

Zitat von PaulJr
Tja… da hast Du wirklich Recht.

Na das kann ich für Dich nur hoffen. :mrgreen:
Zitat:

In meinem Konstrukt wollte ich Dich nur auf die wichtigste Tatsache aufmerksam machen, dass man NIE die Routine FREE aufruft ohne vorher den Pointer zu überprüfen, da falls NIL dann hast Du ein echtes Problem
Stümmt nicht. Das Free kann nur aufgerufen werden, wenn der Konstruktor erfolgreich war.
Es kann also nach der der Erzeugung der Instanz unmöglich mit einer nil-Referenz gearbeitet werden.
Exceptions gehören genauso zur Flusskontrolle wie Schleifen oder if-Statements. ;)

Der Code von Luke wäre IMO in einer simpelsten Form auch am richtigsten:
Delphi-Quellcode:
var
  putNameHere : TSomeClas;
begin
  putNameHere := TSomeClas.Create();
  try
    putNameHere.SomeMethod();
    putNameHere.SomeMethodThatThrows(); //wirft Exception!
  finally
    putNameHere.Free();
  end;
end;
btw: Bist du der PaulJr?
Ahh der rote Katen fehlte, du bist es also. Habe schon einiges von dir gehört. War allerdings bevor ein gewisser Robert_G dieses Forum heimsuchte. :mrgreen:

3_of_8 11. Feb 2007 23:00

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Zitat:

Es kann also nach der der Erzeugung der Instanz unmöglich mit einer nil-Referenz gearbeitet werden.
Free ist eine statische Methode, man kann sie sehr wohl aufrufen, auch wenn die Klasse nicht instantiiert ist. Free ist sogar so freundlich, sich selbst abzubrechen, wenn Self=nil. Nur wenn der Instanzenpointer nicht nil ist, krachts.

EDIT:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var a: TObject;
begin
  a:=nil;
  a.Free; //Das kracht nicht
  a.ClassType; //Das schon
end;

Elvis 11. Feb 2007 23:02

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Zitat:

Zitat von 3_of_8
Zitat:

Es kann also nach der der Erzeugung der Instanz unmöglich mit einer nil-Referenz gearbeitet werden.
Free ist eine statische Methode, man kann sie sehr wohl aufrufen, auch wenn die Klasse nicht instantiiert ist. Free ist sogar so freundlich, sich selbst abzubrechen, wenn Self=nil. Nur wenn der Instanzenpointer nicht nil ist, krachts.

Da sagst du mir nix neues. ;) Ändert auch nix an meinem Punkt, oder? :zwinker:

PaulJr 11. Feb 2007 23:03

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Ja Elvis :) , der bin ich…(bin für ein paar Jahre ausgestiegen… und jetzt bin ich zurück… und offensichtlich sollte ich etwas genauere Antworten geben: Versprochen :idea: )

Ja in diesem Fall hast natürlich Recht.

Ich bin alte Programmierer und programmiere immer so… ist aber nicht so weiter wichtig…

Gruß

PaulJr.

PaulJr 11. Feb 2007 23:04

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Var
StringList : TstringList;
Begin
StringList.Free; // da kommt leider Exeption…

Das allerdings geht in die Hosen :shock:

Luckie 11. Feb 2007 23:06

Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
 
Zitat:

Zitat von PaulJr
Habe natürlich Luckie :???: gemeint. Ja ich bin der "alte" PaulJr.

Herzlich willkommen zurück. :P :hi: Schreib mal eine PN, was du so gemacht hast und wie es dir ergangen ist. Hier hat sich ja viel getan, wie du siehst. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.
Seite 2 von 3     12 3      

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