![]() |
try ... except ... finally ... ~ funktionieren nicht ?
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo.
Das Problem, dass ich habe, ist einfach ich komme nicht in meinen Except-Block bei der Exception-Behandlung hinein. Beispiele im Anhang. Der Fehler tritt immer dann auf, wenn der Client versucht mit dem Server zu verbinden, wobei der Server down ist. Mir wirft der Debugger nur die Fehlermeldung aus. Wenn ich den Debugger ausschalte, wirft mir das OS die passende Fehlermeldung aus. Ich möchte den Fehler aber selber behandeln. Das geht halt nicht. Ich wär ja schon froh, wenn ich etwas falsch gemacht habe, aber ich habe mir schon ein paar Muster in der Delphi Hilfe und im Netz angeschaut. Sie sehen alle gleich aus und wie meine. Was stimmt also nicht ? MfG |
Re: try ... except ... finally ... ~ funktionieren nicht ?
Moin Cicaro,
tritt der Fehler auch auf, wenn das Programm nicht aus der IDE heraus gestartet wird? Damit aus der IDE heraus gestartet keine Exceptions gezeigt werden, muss man in Extras\Debugger Options\Sprach-Exceptions\ die Checkbox Stop bei Debugger Exceptions deaktiviert werden. Die Angabe stimmt nicht genau, da ich ein englisches Delphi habe. Ich hoffe, es reicht, um die Stelle zu finden ;-) |
Re: try ... except ... finally ... ~ funktionieren nicht ?
Es ist egal wie ich die Anwendung starte, ob Explorer oder IDE, es bleibt dabei, dass der Fehler vom System bzw der IDE gemeldet wird. Ich kann keine Exceptions abfangen. Habs auch mit EDivByZero ausprobiert. Geht auch nicht.
|
Re: try ... except ... finally ... ~ funktionieren nicht ?
Seltsam. Was passiert, wenn du den on-do-Block weglässt?
|
Re: try ... except ... finally ... ~ funktionieren nicht ?
Genau dasselbe. Hab schon den Debugger deaktiviert, dann wird die Exception vom System gemeldet.
|
Re: try ... except ... finally ... ~ funktionieren nicht ?
Hmmm, also die beiden Messageboxen, die Du da zeigst, sind offensichtlich Debugger-Meldungen. WEnn Du nicht noch mit irgendwelchen (mir nicht bekannten) Compilerdirektiven rumgespielt hast, dürfen diese Meldungen nicht kommen, wenn Du Deine EXE ausserhalb der IDE startest. Das muss so sein, sonst wäre mein Bild von Delphi tief gestört.
Sherlock |
Re: try ... except ... finally ... ~ funktionieren nicht ?
Wie sieht die Meldung aus, wenn du die exe-Datei direkt im explorer startest, ohne IDE?
|
Re: try ... except ... finally ... ~ funktionieren nicht ?
Wenn Quelltexte schon als Bilder, dann bitte auch in den Anhang damit.
(imageshack löscht ja irgendwann mal diese Bilder ... dann sind sie weg und dieses Thema ist keine Hilfe mehr für Andere, weil etwas wichtiges fehlt) Versucht mal alle exceptions abzufangen
Delphi-Quellcode:
oder
try
except on E: Exception do Caption := Exception(E).Message; end;
Delphi-Quellcode:
[edit]
try
except Caption := Exception(ExceptObject).Message; end; upps, also im Beispiel 2 sollte zumindestens das Beep aufgerufen werden. Zitat:
Und da er die Exceptions komplett abfängt, sollte da auch nichts Anderes sichtbar sein. |
Re: try ... except ... finally ... ~ funktionieren nicht ?
(Ich hab die Bilder ganz oben nochmal in den Anhang getan, damit sie nicht gelöscht werden.)
Der Code aus "except2.png" kann ganz einfach an jeder Stelle im Standard-Programm von Delphi getestet werden. Kann mir bitte jemand sagen, ob er auch die Debugger-Fehlermeldung bekommt oder in den Except-Block hineinkommt (mit Debugger auf an) ? Ansonsten tritt der komische Fehler bei mir nicht zum ersten Mal auf. Ich hatte bloß keinen Nerv mich früher darum zu kümmern. |
Re: try ... except ... finally ... ~ funktionieren nicht ?
Wie willst du bei dem Code in den Except-Block kommen, wenn du im Try-Block eine Exception wirfst?
|
Re: try ... except ... finally ... ~ funktionieren nicht ?
Hallo,
warum schreibst du nicht gleich, dass Caption bei der Exception nicht gesetzt wird ? Dann muss man sich nicht durch Screenshots hangeln ! tztz Zitat:
Mal ein einfaches Bsp. Neues Projekt erstellen Timer aufs Form und in OnTimer rein.
Delphi-Quellcode:
Er piept und es wird argz angezeigt.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin Beep; try raise Exception.Create('bla'); except Caption:= 'argz'; end; end; end. Um eine Exception zu erzeugen, reicht es übrigens nicht, einfach
Delphi-Quellcode:
Ohne das raise passiert gar nichts, ausser ein Speicherleck.
Exception.Create('bla');
Heiko |
Re: try ... except ... finally ... ~ funktionieren nicht ?
So hab den Fehler selber behoben.
Das Problem dabei ist, dass sich einige Exceptions nicht durch "try ... except ..." abfangen lassen, weil sie nicht im Stack des aktuellen Prozesses auftreten. Bei ClientSocket.Open() wird ein neuer Thread mit eigenem Stack instantiiert und dieser kann dann die Exception auslösen. Diese Exception kann man über ein Ereignis abfangen:
Delphi-Quellcode:
Das gilt zunächst einmal für Delphi 7, denk ich mal.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp; type TForm1 = class(TForm) procedure FormClick(Sender: TObject); public procedure SocketErrorBehandlung(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormClick(Sender: TObject); var Client: TClientSocket; begin Client := TClientSocket.Create(Self); Client.Host := 'localhost'; Client.Port := 12345; Client.OnError := SocketErrorBehandlung; // für die Fehlerbehandlung Client.Open(); // <- hier wird der Thread gestartet, der den Fehler/Exception auslösen kann end; procedure TForm1.SocketErrorBehandlung(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin // hier wird der Fehler behandelt Form1.Caption := 'Fehler ist eingetreten, aber behandelt!'; ErrorCode := 0; end; end. Ich bin drauf gekommen, weil die Exception nicht exakt zu dem Zeitpunkt auftritt, als Client.Open() ausgeführt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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