![]() |
Problem mit Exceptionbehandlung
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:
Hier mal die Logdatei:
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;
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) |
AW: Problem mit Exceptionbehandlung
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) |
AW: Problem mit Exceptionbehandlung
Wie kommen denn die Strings überhaupt in die Liste?
|
AW: Problem mit Exceptionbehandlung
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? |
AW: Problem mit Exceptionbehandlung
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. |
AW: Problem mit Exceptionbehandlung
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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