我如何检查像200 OK响应特定的代码,而不印地抛出各种异常出目标URL。 ConnectionTimeout,ConnectionClosedGracefully等..
例如,如果网址不正确或主机无法找到或无法达到。 印地仍会出现上涨例外,即使我试图忽略它们。
所以我的问题是如何正确地忽略这些异常。
我如何检查像200 OK响应特定的代码,而不印地抛出各种异常出目标URL。 ConnectionTimeout,ConnectionClosedGracefully等..
例如,如果网址不正确或主机无法找到或无法达到。 印地仍会出现上涨例外,即使我试图忽略它们。
所以我的问题是如何正确地忽略这些异常。
为了处理所有的异常,正如你说的, 不理会他们,你可以使用几乎是相同的,从@斯泰恩的答案代码的代码:
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协议的异常反应。 而这正是我将在这里阐述。
印地定义了不同的场合很多异常类,当某个动作失败可能发生。 下面是异常类的列表,你可能会感兴趣,当您与HTTP协议的工作中:
EIdException
-它是由印库使用的基本异常类。 当你想通过印引发的异常和程序抛出所有其他异常区分这可能是对你有用。
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;