Indyがあらゆる種類の例外をスローせずに、200OKなどの特定の応答コードのターゲットURLを確認するにはどうすればよいですか。ConnectionTimeout、ConnectionClosedGracefullyなど...
たとえば、URLが適切でない場合、またはそのホストが見つからないか、到達できない場合です。私がそれらを無視しようとしても、インディはまだ例外を発生させます。
だから私の質問は、これらの例外を適切に無視する方法です。
Indyがあらゆる種類の例外をスローせずに、200OKなどの特定の応答コードのターゲットURLを確認するにはどうすればよいですか。ConnectionTimeout、ConnectionClosedGracefullyなど...
たとえば、URLが適切でない場合、またはそのホストが見つからないか、到達できない場合です。私がそれらを無視しようとしても、インディはまだ例外を発生させます。
だから私の質問は、これらの例外を適切に無視する方法です。
すべての例外を処理し、あなたが言うように、それらを無視するには、@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;
ある日、クラスによってスローされた特定のタイプの例外に何らかの形で反応したいと思うかもしれません。TIdHTTP
たとえば、HTTPプロトコルの例外にのみ反応します。そして、それが私がここで詳しく説明しようとしていることです。
Indyは、特定のアクションが失敗したときに発生する可能性のある、さまざまな機会に対応する多くの例外クラスを定義しています。HTTPプロトコルを使用しているときに気になる可能性のある例外クラスのリストを次に示します。
EIdException
-これは、Indyライブラリで使用される基本例外クラスです。Indyによって発生した例外と、アプリケーションによってスローされた他のすべての例外を区別したい場合に役立つことがあります。
EIdSocketError
--HTTPプロトコルの抽象化の観点からは、これは低レベルの例外クラスであり、特定のソケット操作が失敗したときに発生するすべての例外をカバーします。これは、ネットワークレベルで問題が発生していることを検出するのに役立ちます。
EIdConnClosedGracefully
-このクラスによって発生した例外は、サーバー側が一般的な方法でクライアントとの接続を閉じたことを示します。これは、サーバーに再接続するなど、この状況に対応する必要がある場合に役立ちます。
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;
単純な試行/例外でうまくいくはずです:
try
IdHttp1.Get(...);
Result:=IdHttp1.ResponseCode=200;
except on EIdException do
Result:=false;
end;