0

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

在我尝试重新连接之前,有什么好的或干净的方法来吸收 3 个例外?我看到的 3 个异常是,按出现的顺序,EIdClosedSocket、EIdConnClosedGracefully、EIdSocketError(LastError = WSAECONNABORTED)。在尝试重新连接之前,我想等到与关闭套接字相关的所有异常都已经传播,但我不确定如何构建我的代码循环来做到这一点。

4

1 回答 1

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;
于 2012-06-14T16:08:27.083 回答