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

あなたが示したコードは、再接続の問題を処理する正しい方法ですが、1 つ小さな変更を加える必要があります。exceptブロックを catchExceptionまたはEIdExceptionの代わりに変更しますEIdSocketErrorEIdSocketError発生する可能性のある唯一の例外ではありません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;
于 2012-11-15T17:11:29.857 に答える
2

コードを変更する必要はありません。* プログラムは、予想される例外を既にキャッチしています。

あなたが見ているのは、プログラムが例外が存在することを確認してそれに対して何かをする機会を得る前に、例外がスローされるとすぐにデバッガーが例外をインターセプトすることです。IDE が中断すると、ダイアログ ボックスが表示され、実行を続行するオプションが提供されます。そのオプションを実行するか、ダイアログ ボックスを閉じた後に [実行] ボタンを押します。

一部またはすべての例外を無視するようにデバッガーを構成できます。これは、通常のフロー制御に例外を使用する傾向がある Indy を使用する場合に特に役立ちます。その方法については、以前にここで説明しました。

* Remy's answer は、コードを改善して他の例外をキャッチできることを説明しています。

于 2012-11-15T18:08:49.920 に答える
-1

ここでは while ループは必要ありません。既にスレッド実行中であり、この while ループは常に 1 回だけ実行され、接続されていない場合、スレッドは不定ループになります。

于 2014-06-18T22:09:38.463 に答える