我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久性IdTCPConnection。有时我想断开连接,然后重新连接到设备。我发现当我这样做时,Indy会抛出多达3个单独的异常。这使得开发一个干净的重新连接策略有点凌乱,因为Indy组件在后台线程上,我不想破坏线程Execute()循环。
在尝试重新连接之前,有什么好的或干净的方式来吸收3例例?我看到的3个例外是按照出现的顺序,EIdClosedSocket,EIdConnClosedGracefully,EIdSocketError(LastError = WSAECONNABORTED)。我想等到所有与套接字关闭相关的异常都在尝试重新连接之前传播,但我不知道如何构建我的代码循环来做到这一点。
答案 0 :(得分:2)
一次只能有一个异常到达您的线程代码。只需使用try/except
块将代码包装在线程循环中,然后在下一次循环迭代时重新连接。
while not Terminated do
begin
if not Client.Connected then
try
Client.Connect;
except
Sleep(2500);
Continue;
end;
try
// communicate with device as needed...
except
on E: EIdException do
begin
// Indy socket error, reconnect
Client.Disconnect;
Client.InputBuffer.Clear;
end;
on E: Exception do
begin
// something else happened in your code...
end;
end;
end;