Es werden eben nicht alle Exceptions geloggt, sonst würdest du eine weitere sehen. Das Thread-Objekt hat auch noch eine
Exception, die du abfragen kannst, wenn der Thread sich beendet hat.
System.Classes.TThread.FatalException
Da findest du deine
Exception. Ausgelöst wird diese durch das, was du da in deinem Except-Teil veranstaltest. Der beste Kandidat dafür ist
FIdTCPClient.IOHandler.InputBuffer.Clear;
.
Das liegt daran, dass du relativ blind bei jeder
Exception davon ausgehst, dass du die so behandeln kannst. Dem ist aber nicht so. Bei einer Zugriffsverletzung kannst du das so eben nicht behandeln.
Darum gibt man auch explizit die Exceptions an, die man behandeln kann. Wäre in deinem Falle irgendeine der
EIdExcetion
s. Dem Socket-Fehler kann man so eben nicht beikommen. Im Extremfall schmeisst du mit
FreeAndNil
den
Tcp-Client einfach aus dem Speicher und am Anfang der Schleife erstellst du bei Bedarf den Client.