12

Indyがあらゆる種類の例外をスローせずに、200OKなどの特定の応答コードのターゲットURLを確認するにはどうすればよいですか。ConnectionTimeout、ConnectionClosedGracefullyなど...

たとえば、URLが適切でない場合、またはそのホストが見つからないか、到達できない場合です。私がそれらを無視しようとしても、インディはまだ例外を発生させます。

だから私の質問は、これらの例外を適切に無視する方法です。

4

2 に答える 2

37

1. TIdHTTPによってスローされたすべての例外を無視するにはどうすればよいですか?

すべての例外を処理し、あなたが言うように、それらを無視するには、@Stijnの回答のコードとほぼ同じコードを使用できます。

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create;
  try
    try
      IdHTTP.Get('http://www.example.com');
    except
      // do just nothing here, if you really want to completely ignore all 
      // exceptions thrown from inside the try..except block execution and
      // if you don't want to indicate somehow, that the exception occured
    end;
  finally
    IdHTTP.Free;
  end;
end;

2. TIdHTTPによってスローされた特定の例外を処理する方法は?

ある日、クラスによってスローされた特定のタイプの例外に何らかの形で反応したいと思うかもしれません。TIdHTTPたとえば、HTTPプロトコルの例外にのみ反応します。そして、それが私がここで詳しく説明しようとしていることです。

Indyは、特定のアクションが失敗したときに発生する可能性のある、さまざまな機会に対応する多くの例外クラスを定義しています。HTTPプロトコルを使用しているときに気になる可能性のある例外クラスのリストを次に示します。

  1. EIdException-これは、Indyライブラリで使用される基本例外クラスです。Indyによって発生した例外と、アプリケーションによってスローされた他のすべての例外を区別したい場合に役立つことがあります。

  2. EIdSocketError--HTTPプロトコルの抽象化の観点からは、これは低レベルの例外クラスであり、特定のソケット操作が失敗したときに発生するすべての例外をカバーします。これは、ネットワークレベルで問題が発生していることを検出するのに役立ちます。

  3. EIdConnClosedGracefully-このクラスによって発生した例外は、サーバー側が一般的な方法でクライアントとの接続を閉じたことを示します。これは、サーバーに再接続するなど、この状況に対応する必要がある場合に役立ちます。

  4. EIdHTTPProtocolException-この例外クラスは、特定の要求に対するHTTP応答の処理中にエラーが発生した場合に、スローされる例外に使用されます。これは通常、HTTP応答から予期しない数値のHTTP応答コードを受信した場合に発生します。特にHTTPプロトコルエラーを処理したい場合に便利です。この例外処理により、たとえば、サーバーの応答によって返された特定のHTTPステータスコードに対応できます。

上記の例外の処理を示すコードスケルトンを次に示します。もちろん、メッセージを表示する必要はありませんが、もっと便利なことをしてください。そして、それらすべてを処理する必要はありません。どの例外とどのように処理するかはあなた次第です。

uses
  IdHTTP, IdException, IdStack;

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create;
  try
    try
      IdHTTP.Get('http://www.example.com');
    except
      // this exception class covers the HTTP protocol errors; you may read the
      // response code using ErrorCode property of the exception object, or the
      // same you can read from the ResponseCode property of the TIdHTTP object
      on E: EIdHTTPProtocolException do
        ShowMessage('Indy raised a protocol error!' + sLineBreak +
          'HTTP status code: ' + IntToStr(E.ErrorCode) + sLineBreak +
          'Error message' + E.Message);
      // this exception class covers the cases when the server side closes the
      // connection with a client in a "peaceful" way
      on E: EIdConnClosedGracefully do
        ShowMessage('Indy reports, that connection was closed gracefully!');
      // this exception class covers all the low level socket exceptions
      on E: EIdSocketError do
        ShowMessage('Indy raised a socket error!' + sLineBreak +
          'Error code: ' + IntToStr(E.LastError) + sLineBreak +
          'Error message' + E.Message);
      // this exception class covers all exceptions thrown by Indy library
      on E: EIdException do
        ShowMessage('Indy raised an exception!' + sLineBreak +
          'Exception class: ' + E.ClassName + sLineBreak +
          'Error message: ' + E.Message);
      // this exception class is a base Delphi exception class and covers here
      // all exceptions different from those listed above
      on E: Exception do
        ShowMessage('A non-Indy related exception has been raised!');
    end;
  finally
    IdHTTP.Free;
  end;
end;
于 2012-12-19T14:33:03.040 に答える
4

単純な試行/例外でうまくいくはずです:

try
  IdHttp1.Get(...);
  Result:=IdHttp1.ResponseCode=200;
except on EIdException do
  Result:=false;
end;
于 2012-12-19T11:49:54.730 に答える