我正在编写一个应用程序,它使用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
导致此异常?
答案 0 :(得分:2)
您展示的代码是处理重新连接问题的正确方法,但您需要进行一项小的更改。更改except
块以捕获Exception
或EIdException
而不是EIdSocketError
。 EIdSocketError
不是Connect()
可能引发的唯一可能例外。例如,它可能会引发EIdConnectException
或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;
答案 1 :(得分:2)
无需修改代码。*您的程序已捕获预期的异常。
您所看到的是调试器在您的程序有机会查看异常并对其执行任何操作之前立即拦截异常。当IDE中断您时,它会显示一个对话框,为您提供继续运行的选项。执行该选项,或在关闭对话框后按“运行”按钮。
您可以将调试器配置为忽略部分或全部异常,这在使用Indy时特别有用,因为Indy倾向于使用异常进行正常流控制。 How to do that has been covered here before.
* Remy的回答描述了您可以对代码进行的改进以捕获其他可能的异常。
答案 2 :(得分:-1)
虽然这里不需要循环,因为你已经在一个线程执行中,这个while循环只会执行一次,如果没有连接,你的线程将处于一个无限循环中。