【问题标题】:How to check URL with IdHTTP?如何使用 IdHTTP 检查 URL?
【发布时间】:2023-03-09 17:11:01
【问题描述】:

如何检查目标 URL 以获取特定响应代码(例如 200 OK),而 Indy 不会抛出各种异常。 ConnectionTimeout、ConnectionClosedGracefully 等...

例如,如果 URL 不正确或其主机无法找到或无法访问。即使我试图忽略它们,Indy 仍然会引发异常。

所以我的问题是如何正确忽略这些异常。

【问题讨论】:

  • 尝试更具体地解决您的问题。您在使用TIdHTTP 吗?如果是这样,那么您有 TIdHTTP.ResponseCode 可用。
  • @TLama 我的意思是在运行时忽略异常。运行时仍然会抛出异常。ICS 完全无声。
  • 你必须处理它们,因为 Indy 是由异常驱动的。
  • @TLama 怎么样?我不希望我的线程因为异常而退出,那么如何忽略它?

标签: delphi delphi-xe2 indy indy10


【解决方案1】:

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;

【讨论】:

  • 非常有用的答案。谢谢 TLama。 (^_^) ♥ ♥ ♥ ♥
【解决方案2】:

一个普通的try/except 应该可以解决问题:

try
  IdHttp1.Get(...);
  Result:=IdHttp1.ResponseCode=200;
except on EIdException do
  Result:=false;
end;

【讨论】:

  • 希望这将在处理未知 url 时绕过所有异常
  • 我反对 吃掉任何异常 处理程序。如果您具体说明要处理 的内容并让其他异常飞出try/except 块,那就更好了。例如,这将因内存不足、资源不足异常和任何其他类型的错误而静默失败。如果您正在处理 Indy 异常,最好为您知道如何处理的每个特定错误添加处理程序,或者至少只吃 EIdException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2010-09-22
  • 2012-07-28
  • 1970-01-01
  • 2014-10-05
  • 2012-03-11
相关资源
最近更新 更多