Indy Exception nicht auffangbar
Hey,
nach vielen Versuchen, die Exception doch irgendwie aufzufangen hoffe ich hier auf Hilfe. Ich beginne gerade mit Indy zu experimentieren und wollte eine kleine Client-Server Applikation schreiben. Soweit klappte auch alles, aber wenn ich den Server beende, während der Client noch verbunden ist, wird eine Exception ausgelöst. Die Meldung lautet: "Project Project1.exe raised exception class EIdSocketError witch message 'Socket Error # 10061 Connection refused.'." Ich finde einfach nicht herraus, wie ich die Exception auffangen kann. Globales Exceptionhandling mit diesem Code (von http://www.delphi-treff.de/tutorials...ptionhandling/) funktionert nicht.
Delphi-Quellcode:
Ein try...except block scheint das ganze auch nicht beheben zu können, da die Exception nicht durch eine Aktion des Clients ausgelöst wird.
procedure TForm3.AppException(Sender: TObject; E: Exception);
begin if Sender is TComponent then MessageDlg(Format('Es ist folgender Fehler aufgetreten:%s%s%s'+ 'Fehlertyp:%s%s%sSender:%s%s [%s]', [#10#13, E.Message, #13#10#13#10, #10#13, E.ClassName, #10#13#10#13, #13#10, TComponent(Sender).Name, Sender.ClassName]), mtError, [mbOk], 0) else MessageDlg(Format('Es ist folgender Fehler aufgetreten:%s%s%s'+ 'Fehlertyp:%s%s%sSender:%s%s', [#10#13, E.Message, #13#10#13#10, #10#13, E.ClassName, #10#13#10#13, #13#10, Sender.ClassName]), mtError, [mbOk], 0); end; procedure TForm3.FormCreate(Sender: TObject); begin Application.OnException := AppException; end; Ich hoffe ihr könnt mir helfen. |
AW: Indy Exception nicht auffangbar
Hallo,
wenn Du Dein Programm aus der IDE gestartet hat, wird jede Fehlermeldung hochgereicht. Versuche mal Dein Programm ohne Delphi IDE zu starten - dann sollte die Exception auch abgefangen werden. Grüße Klaus |
AW: Indy Exception nicht auffangbar
Hey,
Die Exception wird leider trotzdem nicht abgefangen, nur das ganze Programm stürtz ab und reagiert nicht mehr. |
AW: Indy Exception nicht auffangbar
Diese Exception kommt typischerweise irgendwo aus dem TIdTCPClient.Connect, wenn der Server nicht aktiv ist. In diesem Fall sollte das Connect und Daten schicken/empfangen in einen try finally Block.
|
AW: Indy Exception nicht auffangbar
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin if TCPClient.Connected = TRUE then begin try TCPClient.Disconnect; Button1.Caption := 'Client starten'; Memo1.Lines.Add('Client beendet'); except on E: EIdSocketError do ShowMessage('Fehler:'#13 + E.Message); end; end else begin try TCPClient.Connect; Button1.Caption := 'Client beenden'; Memo1.Lines.Add('Client gestartet'); except on E: EIdSocketError do ShowMessage('Fehler:'#13 + E.Message); end; end; end;
Delphi-Quellcode:
Das ist mein Code, trotz der try...except blöcke gibt es die exception.
procedure TForm3.Button2Click(Sender: TObject);
begin try TCPClient.IOHandler.WriteLn(Edit1.text); Memo1.Lines.Add(Edit1.Text + ' an Server gesendet'); Edit1.Text := ''; except on E: EIdSocketError do ShowMessage('Fehler:'#13 + E.Message); end; end; |
AW: Indy Exception nicht auffangbar
1. nicht auf 'TRUE' testen
2. begin/end um try/except ist überflüssig Ist aber nicht fehlerauslösend. Dein Code ist soweit korrekt, wenn es hängt, dann woanders. |
AW: Indy Exception nicht auffangbar
Danke für die Hinweise.
Ich hab mal das ganze Projekt hochgeladen, falls Zeit und Lust hat vorhanden sind, kann es sich ja mal jemand ansehen. http://www.mediafire.com/?1r5g7v3vht19bw6 |
AW: Indy Exception nicht auffangbar
Schreib ins OnDisconnect vom Server noch ein
Delphi-Quellcode:
.
if TCPServer.Active then
Eine andere (und wie ich finde bessere) Möglichkeit wäre, vom Server vor dem Beenden alle Verbindungen kappen zu lassen:
Delphi-Quellcode:
Genereller Hinweis: Versuche lieber die Ursache einer Exception zu beseitigen (natürlich nur sofern möglich) anstatt sie irgendwo abzufangen.
var
list: TList; i: Integer; begin list:= TCPServer.Contexts.LockList; try for i := 0 to list.Count - 1 do TIdContext(list[i]).Connection.Disconnect; finally TCPServer.Contexts.UnlockList; end; end; |
AW: Indy Exception nicht auffangbar
Vielen Dank für die Hilfe.
Natürlich war es mein Ziel die Ursache zu beseitigen. Ich wusste allerdings nicht, welcher Teil des Code die Exception ausslöst und somit verändert werden muss. Warum wird das OnDisconnected Event des Clients nicht ausgelöst, wenn ich den Server schließe und mit deinem Code die Verbindungen kappe? Übrigens wird die Exception weiterhin ausgelöst, nur das Programm stürtz nicht mehr ab. Was bedeutet eigentlich der Befehl?
Delphi-Quellcode:
TCPServer.Contexts.UnlockList
Und noch eine andere Frage, gibts es vielleicht eine Zusammenfassung der wichtigsten Befehle für Indy? Ich finde mit Google nur Tutorials, in denen mir ein paar Zeilen Code ohne Umfassende Erklärung vorgesetzt werden. Oder wie kommt ihr zum Beispiel darauf, das es "TCPServer.Contexts.UnlockList" gibt und was es bewirkt? |
AW: Indy Exception nicht auffangbar
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr. |
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