![]() |
Bubblen Exceptions nach oben durch einen try-finally-Block?
Hallo, folgende Struktur:
Delphi-Quellcode:
Ich will eine Fehler bei der Erstellung der Klasse abfangen - innerhalb des try...finally-blocks interessieren mich keine Exceptions.
try
with TSomeClass.Create do try SomeMethod; SomeMethodThatThrows; //wirft Exception! finally Free; end; except on E:Exception do ShowmEssage(E.Message); end; Klappt das oder kommt die Exception, die ich oben markiert hab, aus dem try...finally-block irgendwie raus? |
Re: Bubblen Exception nach oben durch einen try-finally-Bloc
Delphi-Quellcode:
So würd ich das machen.
with TSomeClass.Create do
try SomeMethod; SomeMethodThatThrows; //wirft Exception! except on E:Exception do ShowmEssage(E.Message); end; Free; |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Es dürfte kein Exception außerhalb des Blocks entstehen.
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Negatori.
Ich will es abfangen, wenn die Klasse beim Erzeugen wirft. Im Konkreten geht es um einen Filestream. @mkinzler: Ja, glaube das reicht mir. |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Das hättest du auch dazusagen können.
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Hab ich.
Zitat:
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Hallo DGL-luke,
man könnte dies z.B. so machen:
Delphi-Quellcode:
Gruß :???:
var
SomeClas : TSomeClas; Begin try SomeClas := TSomeClas.Create; If SomeClas <> NIL then with SomeClas do try SomeMethod; SomeMethodThatThrows; //wirft Exception! finally Free; end; except on E:Exception do ShowmEssage(E.Message); end; end; PaulJr. |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Ich vermute mal, wenn der Konstruktor eine Exception wirft, bleibt der Pointer so, wie er vorher war. Das heißt, wenn man ihn vorher mit nil initialisiert, würde es gehen.
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Das funktioniert:
Delphi-Quellcode:
Ich habe keine Schreibrechte auf c:\ und als Nachricht wird foobar aisgegeben.
procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream; begin try fs := TFileStream.Create('c:\test.txt', fmCreate); try finally FreeAndNil(fs); end; except on E: Exception do ShowMessage('foobar'); end; end; |
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. |
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. |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
Zitat:
Zitat:
|
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... |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
Zitat:
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:
btw: Bist du der PaulJr?
var
putNameHere : TSomeClas; begin putNameHere := TSomeClas.Create(); try putNameHere.SomeMethod(); putNameHere.SomeMethodThatThrows(); //wirft Exception! finally putNameHere.Free(); end; end; 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: |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
EDIT:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var a: TObject; begin a:=nil; a.Free; //Das kracht nicht a.ClassType; //Das schon end; |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
|
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. |
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: |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Klar. Weil der Pointer da nicht initialisiert ist. Wenn du ihn auf nil setzt, geht es.
@Elvis: Hab dich falsch verstanden. ;) |
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Zitat:
StringList könnte genauso gut irgendwo hin zeigen, wo vorher eine richtige Instanz lag. Zitat:
|
Re: Bubblen Exceptions nach oben durch einen try-finally-Blo
Hallo 3_of_8 :-D
Schon klar, das ist das gerade. Es ist nicht oft so, dass ein Objeckt in einer Routine erzeugt wird und dann SOFORT freigegeben. Viel mehr gibt man oft so erzeugte Objecte in anderen Routinen frei (z.B. in OnClose) Darum es ist notwendig der Status NIL abzufragen… Hier stimme ich Dir zu… Gruß PaulJr. P.S. Hallo Luckie, :-D eines Tages schreibe ich Dir… aber jetzt bin ich schwer an programmieren. Ja, Du hast Recht…, es ist hier irgendwie sehr angenehm geworden (oder ich bin netter geworden… oder vielleicht beides ) Viele Grüße PaulJr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 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 by Thomas Breitkreuz