AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy Exception nicht auffangbar

Indy Exception nicht auffangbar

Offene Frage von "Stevie"
Ein Thema von Halux · begonnen am 14. Okt 2011 · letzter Beitrag vom 16. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2   
Halux

Registriert seit: 12. Okt 2011
6 Beiträge
 
#1

Indy Exception nicht auffangbar

  Alt 14. Okt 2011, 17:45
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Indy Exception nicht auffangbar

  Alt 14. Okt 2011, 18:01
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
Klaus
  Mit Zitat antworten Zitat
Halux

Registriert seit: 12. Okt 2011
6 Beiträge
 
#3

AW: Indy Exception nicht auffangbar

  Alt 14. Okt 2011, 18:03
Hey,

Die Exception wird leider trotzdem nicht abgefangen, nur das ganze Programm stürtz ab und reagiert nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Indy Exception nicht auffangbar

  Alt 14. Okt 2011, 22:10
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Halux

Registriert seit: 12. Okt 2011
6 Beiträge
 
#5

AW: Indy Exception nicht auffangbar

  Alt 15. Okt 2011, 11:36
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.
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#6

AW: Indy Exception nicht auffangbar

  Alt 15. Okt 2011, 15:33
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.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Halux

Registriert seit: 12. Okt 2011
6 Beiträge
 
#7

AW: Indy Exception nicht auffangbar

  Alt 15. Okt 2011, 16:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.007 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Indy Exception nicht auffangbar

  Alt 15. Okt 2011, 18:47
Schreib ins OnDisconnect vom Server noch ein 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (15. Okt 2011 um 18:51 Uhr)
  Mit Zitat antworten Zitat
Halux

Registriert seit: 12. Okt 2011
6 Beiträge
 
#9

AW: Indy Exception nicht auffangbar

  Alt 16. Okt 2011, 00:27
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?
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?

Geändert von Halux (16. Okt 2011 um 13:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Indy Exception nicht auffangbar

  Alt 16. Okt 2011, 03:58
Wenn man etwas nicht weiß, kann man auch mal in die Hilfe schauen.
Delphi-Referenz durchsuchenUnlockList

Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 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