4

我正在编写一个应用程序,它用于TIdTCPClient通过套接字与另一个应用程序通信。

我希望应用程序尝试连接到某个服务器,直到建立连接(即,直到服务器上线)。

为此,我编写了以下代码:

procedure SendingThread.Execute();
var
I : integer;
Test : string;
IsConnected : Boolean;
begin
    TcpClient := TIdTCPClient.Create;
    TcpClient.Host := '127.0.0.1';
    TcpClient.Port := 9999;
    TcpClient.ConnectTimeout := 60000;

    IsConnected := false;
    while not IsConnected do
        begin
        try
            TcpClient.Connect;
            IsConnected := True;
        except
            on E:EIdSocketError do
                IsConnected := false;
        end;
    end;
...
end;

当我在服务器脱机的情况下运行此代码时,我得到EIdSocketError错误代码10061。之后抛出异常TcpClient.Connect;

我怎样才能修改代码,以便在except原因中捕获此异常?

4

3 回答 3

3

您显示的代码是处理重新连接问题的正确方法,但您需要对其进行一点小改动。将块更改except为 catchExceptionEIdException代替EIdSocketError. EIdSocketError不是唯一可能Connect()引发的异常。例如,它可以引发EIdConnectExceptionor EIdConnectTimeout,这两者都不是从 派生的EIdSocketError

procedure SendingThread.Execute;
var
  ...
  IsConnected : Boolean;
begin
  ...
  IsConnected := False;
  while (not IsConnected) and (not Terminated) do
  begin
    try
      TcpClient.Connect;
      IsConnected := True;
    except
      on E: Exception do
        IsConnected := False;
    end;
  end;
  ...
end;

您也可以完全删除该on E子句,因为它没有做任何有用的事情。引发异常时,该IsConnected变量已经为 False,因此无需将其重新分配给相同的值。

procedure SendingThread.Execute;
var
  ...
  IsConnected : Boolean;
begin
  ...
  IsConnected := false;
  while (not IsConnected) and (not Terminated) do
  begin
    try
      TcpClient.Connect;
      IsConnected := True;
    except
    end;
  end;
  ...
end;
于 2012-11-15T17:11:29.857 回答
2

无需修改代码。*您的程序已经捕获了预期的异常。

您所看到的是调试器在异常被抛出后立即拦截,在您的程序有机会看到异常存在并对其执行任何操作之前。当 IDE 中断您时,它会显示一个对话框,让您可以选择继续运行。执行该选项,或在关闭对话框后按“运行”按钮。

您可以将调试器配置为忽略部分或全部异常,这在使用 Indy 时特别有用,Indy 倾向于使用异常进行正常的流控制。如何做到这一点之前已经在这里介绍过。

* Remy 的回答描述了您可以对代码进行的改进以捕获其他可能的异常。

于 2012-11-15T18:08:49.920 回答
-1

此处不需要 while 循环,因为您已经在执行线程中,并且此 while 循环将始终只执行一次,如果未连接,您的线程将处于无限循环中。

于 2014-06-18T22:09:38.463 回答