Delphi Indy在关闭套接字时抛出多个异常。如何进行干净的自动重新连接?

Delphi Indy在关闭套接字时抛出多个异常。如何进行干净的自动重新连接?,delphi,sockets,indy,disconnect,Delphi,Sockets,Indy,Disconnect,我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久IDTCP连接。有时我想断开连接,然后重新连接到设备。我发现,当我这样做时,印地抛出多达3个不同的例外。这使得开发干净的重新连接策略变得有些混乱,因为Indy组件位于后台线程上,我不想破坏线程Execute()循环 在我尝试重新连接之前,吸收这3个异常的好方法或干净方法是什么?我看到的3个例外情况按外观顺序是:EIdClosedSocket、EIDConClosedGracefully、EIdSocketError(L

我有一个Delphi 6应用程序,它使用Indy 9组件来维护与外部设备的持久IDTCP连接。有时我想断开连接,然后重新连接到设备。我发现,当我这样做时,印地抛出多达3个不同的例外。这使得开发干净的重新连接策略变得有些混乱,因为Indy组件位于后台线程上,我不想破坏线程Execute()循环


在我尝试重新连接之前,吸收这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()
来代替。好的,谢谢。出于某种原因,我给人的印象是,我遇到了不止一个异常,但这可能是因为我设置了断点,看到了来自多个组件实例的异常,并错误地将它们理解为都是针对同一实例的。