Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy Exception nicht auffangbar (https://www.delphipraxis.net/163766-indy-exception-nicht-auffangbar.html)

Halux 14. Okt 2011 16:45

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:
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;
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.

Ich hoffe ihr könnt mir helfen.

Klaus01 14. Okt 2011 17:01

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

Halux 14. Okt 2011 17:03

AW: Indy Exception nicht auffangbar
 
Hey,

Die Exception wird leider trotzdem nicht abgefangen, nur das ganze Programm stürtz ab und reagiert nicht mehr.

Stevie 14. Okt 2011 21:10

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.

Halux 15. Okt 2011 10:36

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:
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;
Das ist mein Code, trotz der try...except blöcke gibt es die exception.

FredlFesl 15. Okt 2011 14:33

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.

Halux 15. Okt 2011 15:33

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

Stevie 15. Okt 2011 17:47

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:
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;
Genereller Hinweis: Versuche lieber die Ursache einer Exception zu beseitigen (natürlich nur sofern möglich) anstatt sie irgendwo abzufangen.

Halux 15. Okt 2011 23:27

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?

Sir Rufo 16. Okt 2011 02:58

AW: Indy Exception nicht auffangbar
 
Wenn man etwas nicht weiß, kann man auch mal in die Hilfe schauen.
Delphi-Referenz durchsuchenUnlockList

;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
Seite 1 von 2  1 2      

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