Delphi Indy在关闭套接字时抛出多个异常。如何进行干净的自动重新连接?
我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久IDTCP连接。有时我想断开连接,然后重新连接到设备。我发现,当我这样做时,印地抛出多达3个不同的例外。这使得开发干净的重新连接策略变得有些混乱,因为Indy组件位于后台线程上,我不想破坏线程Execute()循环Delphi Indy在关闭套接字时抛出多个异常。如何进行干净的自动重新连接?,delphi,sockets,indy,disconnect,Delphi,Sockets,Indy,Disconnect,我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久IDTCP连接。有时我想断开连接,然后重新连接到设备。我发现,当我这样做时,印地抛出多达3个不同的例外。这使得开发干净的重新连接策略变得有些混乱,因为Indy组件位于后台线程上,我不想破坏线程Execute()循环 在我尝试重新连接之前,吸收这3个异常的好方法或干净方法是什么?我看到的3个例外情况按外观顺序是:EIdClosedSocket、EIDConClosedGracefully、EIdSocketError(L
在我尝试重新连接之前,吸收这3个异常的好方法或干净方法是什么?我看到的3个例外情况按外观顺序是:EIdClosedSocket、EIDConClosedGracefully、EIdSocketError(LastError=WSAECONNABORTED)。在尝试重新连接之前,我想等待与关闭套接字相关的所有异常传播,但我不确定如何构造代码循环来完成此操作。一次只有一个异常到达线程的代码。只需使用
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;
但是,当我希望新重新连接的连接保持可用时,“额外”异常将导致Except块再次启动。对吗?那不是个问题吗?顺便说一句,如果你有机会,我想听听你对我在Stack Overflow上打开的另一篇关于刷新AviSaveOptions()提供的编解码器列表的文章的看法:不,你所描述的不正确。正如我所说,只有一个异常会访问您的代码。它可能是
EIdClosedSocket
或eidconclosedgracely
或EIdSocketError
,但决不能同时使用这三个选项。而Disconnect()
本身不应该引发任何异常,但如果是,请尝试使用DisconnectSocket()
来代替。好的,谢谢。出于某种原因,我给人的印象是,我遇到了不止一个异常,但这可能是因为我设置了断点,看到了来自多个组件实例的异常,并错误地将它们理解为都是针对同一实例的。