AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem mit Exceptionbehandlung

Ein Thema von Hobbycoder · begonnen am 5. Jul 2021 · letzter Beitrag vom 6. Jul 2021
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
881 Beiträge
 
#1

Problem mit Exceptionbehandlung

  Alt 5. Jul 2021, 18:54
Hi,

ich habe ein Problem mit einer Expeptionbehandlung. Nicht direkt mit dem Anfangen, das funktioniert.
Zum senden von Nachrichten über TIdTCPClient habe ich eine einfache Stringlist, welche die zu sendenden Kommandos beinhaltet. Diese wir in einem Thread laufend abgefragt, und wenn Count>0 dann wird das Item[0] eben über TCP gesendet und anschließend entfernt. Das functioniert soweit. Wenn aber der TCPClient keinen Connect aufbauen kann, soll das Item[0] trotzdem gelöscht werden, weil es später zu senden, keinen sinn macht.
Während bei erfolgreichem Senden das Item auch gelöscht wird, so verbleibt bei nicht erfolgreichem Senden in meiner stringlist.
Ich muss irgendwo in meiner Exceptionbehandlung einen Fehler machen.

Delphi-Quellcode:
    while not self.Terminated do
    begin
      if FMsgQueue.Count>0 then
      begin
        FTCPClient.Host:='127.0.0.1';
        FTCPClient.Port:=Self.FDestinationPort;
        try
          FTCPClient.Connect;
          try
            if FTCPClient.Connected then
            begin
              FTCPClient.Socket.WriteLn(FMsgQueue[0]);
              DoError('No Error (QueueMsgCount: '+IntToStr(FMsgQueue.Count)+')');
            end;
          finally
            FTCPClient.Disconnect;
            FMsgQueue.Delete(0);
          end;
        except
          on E: Exception do
          begin
            if FMsgQueue.Count>0 then FMsgQueue.Delete(0);
            DoError(E.Message+' (QueueMsgCount: '+IntToStr(FMsgQueue.Count)+')');
          end;
        end;
      end;
      Sleep(50);
    end;
Hier mal die Logdatei:
Code:
18:49:40,018: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 4)
18:49:42,105: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 6)
18:49:44,197: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 13)
18:49:46,273: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 18)
18:49:48,357: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 25)
18:49:50,444: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 27)
18:49:52,534: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 29)
18:49:54,620: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 34)
18:49:56,714: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 36)
18:49:58,810: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 38)
18:50:00,896: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 43)
18:50:02,994: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 45)
18:50:05,081: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 47)  
18:50:05,659: TCPClient: No Error (QueueMsgCount: 47)                                   <<--- Hier stell ich dann den TCP-Server bereit.
18:50:05,722: TCPClient: No Error (QueueMsgCount: 46)
18:50:05,785: TCPClient: No Error (QueueMsgCount: 45)
18:50:05,849: TCPClient: No Error (QueueMsgCount: 47)
18:50:05,913: TCPClient: No Error (QueueMsgCount: 46)
18:50:05,976: TCPClient: No Error (QueueMsgCount: 45)
18:50:06,040: TCPClient: No Error (QueueMsgCount: 44)
18:50:06,100: TCPClient: No Error (QueueMsgCount: 43)
18:50:06,163: TCPClient: No Error (QueueMsgCount: 42)
18:50:06,227: TCPClient: No Error (QueueMsgCount: 41)
18:50:06,292: TCPClient: No Error (QueueMsgCount: 40)
18:50:06,354: TCPClient: No Error (QueueMsgCount: 39)
18:50:06,434: TCPClient: No Error (QueueMsgCount: 38)
18:50:06,494: TCPClient: No Error (QueueMsgCount: 37)
18:50:06,557: TCPClient: No Error (QueueMsgCount: 36)
18:50:06,625: TCPClient: No Error (QueueMsgCount: 35)
18:50:06,686: TCPClient: No Error (QueueMsgCount: 34)
18:50:06,757: TCPClient: No Error (QueueMsgCount: 33)
18:50:06,812: TCPClient: No Error (QueueMsgCount: 32)
18:50:06,874: TCPClient: No Error (QueueMsgCount: 31)
18:50:06,939: TCPClient: No Error (QueueMsgCount: 30)
18:50:07,001: TCPClient: No Error (QueueMsgCount: 29)
18:50:07,063: TCPClient: No Error (QueueMsgCount: 28)
18:50:07,129: TCPClient: No Error (QueueMsgCount: 27)
18:50:07,191: TCPClient: No Error (QueueMsgCount: 26)
18:50:07,255: TCPClient: No Error (QueueMsgCount: 25)
18:50:07,331: TCPClient: No Error (QueueMsgCount: 24)
18:50:07,392: TCPClient: No Error (QueueMsgCount: 23)
18:50:07,456: TCPClient: No Error (QueueMsgCount: 25)
18:50:07,519: TCPClient: No Error (QueueMsgCount: 24)
18:50:07,611: TCPClient: No Error (QueueMsgCount: 23)
18:50:07,676: TCPClient: No Error (QueueMsgCount: 22)
18:50:07,739: TCPClient: No Error (QueueMsgCount: 21)
18:50:07,805: TCPClient: No Error (QueueMsgCount: 20)
18:50:07,868: TCPClient: No Error (QueueMsgCount: 19)
18:50:07,929: TCPClient: No Error (QueueMsgCount: 18)
18:50:07,992: TCPClient: No Error (QueueMsgCount: 17)
18:50:08,057: TCPClient: No Error (QueueMsgCount: 16)
18:50:08,118: TCPClient: No Error (QueueMsgCount: 15)
18:50:08,180: TCPClient: No Error (QueueMsgCount: 14)
18:50:08,253: TCPClient: No Error (QueueMsgCount: 13)
18:50:08,307: TCPClient: No Error (QueueMsgCount: 12)
18:50:08,376: TCPClient: No Error (QueueMsgCount: 11)
18:50:08,433: TCPClient: No Error (QueueMsgCount: 10)
18:50:08,496: TCPClient: No Error (QueueMsgCount: 9)
18:50:08,560: TCPClient: No Error (QueueMsgCount: 8)
18:50:08,624: TCPClient: No Error (QueueMsgCount: 7)
18:50:08,688: TCPClient: No Error (QueueMsgCount: 6)
18:50:08,750: TCPClient: No Error (QueueMsgCount: 5)
18:50:08,838: TCPClient: No Error (QueueMsgCount: 4)
18:50:08,892: TCPClient: No Error (QueueMsgCount: 3)
18:50:08,956: TCPClient: No Error (QueueMsgCount: 2)
18:50:09,020: TCPClient: No Error (QueueMsgCount: 1)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
881 Beiträge
 
#2

AW: Problem mit Exceptionbehandlung

  Alt 5. Jul 2021, 19:11
Ich hab's jetzt mal so versucht. Jetzt übergebe ich vor dem Connect das Item in einen String und lösche es aus der Liste. Trotzdem schein meine List zu wachsen.

Delphi-Quellcode:
    while not self.Terminated do
    begin
      if FMsgQueue.Count>0 then
      begin
        FTCPClient.Host:='127.0.0.1';
        FTCPClient.Port:=Self.FDestinationPort;
        MsgStr:=FMsgQueue[0];
        FMsgQueue.Delete(0);
        try
          FTCPClient.Connect;
          try
            if FTCPClient.Connected then
            begin
              FTCPClient.Socket.WriteLn(FMsgQueue[0]);
              DoError('No Error (QueueMsgCount: '+IntToStr(FMsgQueue.Count)+')');
            end;
          finally
            FTCPClient.Disconnect;
            //FMsgQueue.Delete(0);
          end;
        except
          on E: Exception do
          begin
            //if FMsgQueue.Count>0 then FMsgQueue.Delete(0);
            DoError(E.Message+' (QueueMsgCount: '+IntToStr(FMsgQueue.Count)+')');
          end;
        end;
      end;
      Sleep(50);
    end;
Code:
19:06:59,229: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 6)
19:07:01,307: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 8)
19:07:03,399: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 10)
19:07:05,482: TCPClient: Socket-Fehler # 10061Verbindung abgelehnt. (QueueMsgCount: 15)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.642 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Problem mit Exceptionbehandlung

  Alt 5. Jul 2021, 22:22
Wie kommen denn die Strings überhaupt in die Liste?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.570 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Problem mit Exceptionbehandlung

  Alt 5. Jul 2021, 22:32
FMsgQueue ist natürlich thread-save?

Und rate auch mal, wie oft gelöscht wird, wenn es innerhalb des try-finally knallt. (in Post #1)
Wenn, dann gehört das löschen vor das finally, wenn es bei "erfolgreich" sein soll.

Ach ja, und was passiert wohl, wenn es im Connect nicht knallt und Connected=False ist?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
201 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Problem mit Exceptionbehandlung

  Alt 6. Jul 2021, 08:54
Ich würde das Commando erst aus der Liste nehmen. Ist es gesendet soll es weg sein, im Fehlerfall auch.
Es macht also keinen Sinn es in der Liste zu lassen.

Noch was, je nachdem was du für eine implementierung des TCPClient hast kann auch mal Zeit vergehen zwischen Befehl Connect und Feld Connected = true.
Ich würde also Connected in einer Schleife für kurze Zeit immer wieder prüfen.

Und, für jede Nachricht die Verbindung neu aufmachen ist auch irgendwie ein bisschen merkwürdig. Finde ich jedenfalls.
Stefan
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.810 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Problem mit Exceptionbehandlung

  Alt 6. Jul 2021, 09:24
Bei TIdTCPClient braucht nach dem Connect nicht auf Connected geprüft zu werden: wenn Connect nicht erfolgreich ist, wird eine Exception ausgelöst. Falls es erfolgreich ist, ist Connected (bis zum Disconnect) True.
Michael Justin
  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 +2. Es ist jetzt 22:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf