我正在编写一个程序来检查网站以测试它们的当前状态,例如200 好的。我正在使用 Delphi 2010 附带的 Indy HTTP 来完成此任务并拥有当前代码。

procedure TCheckSiteIndividual.Execute;
var
http : TIdhttp;

begin
  try
    try
      http := Tidhttp.create(nil);  //Create indy
      http.Get(CSiteURL,nil);  //Send Request To Check Site
    except
      on E: EIdHTTPProtocolException do
       status := http.ResponseText; // or: code := E.ErrorCode;
    end;

    status := http.ResponseText;   //Return Status of Site
    synchronize(updateform);   //Update data to form
  finally
   http.Free;
  end;
end;
CSiteURL变量在Thread Constructor中设置,status变量是对整个线程的变量。

这次尝试,除了部分代码来自 Remy Lebeau - TeamB here,这是我最初摆弄这个想法时问的一个问题。我遇到的问题是此代码仅在站点返回 200 OK 代码时才有效。其他任何事情都会导致异常,包括我是否禁用了互联网。这也会导致重定向的站点出现异常,例如www.google.com 在调试期间导致异常我认为它会为我重定向到 www.google.co.uk,但是如果我继续通过异常然后它返回一个 301 FOUND 代码没有问题。

我正在寻找它的最终结果,它根据站点是否在线或有错误(例如 HTML RETURN CODE)给我一个返回,另外在站点不存在时提供反馈(例如未注册的 URL)或者就是联系不上。

我正在寻找的其他建议是关于如何从请求中获取更多信息。具体来说,目前我还希望获得已检查站点的 IP。

如果不需要在任何 URL 之前使用 http://就可以使用它也会很好,因此例如 www.google.com 将可以工作,但目前由于未知协议(protocol)而无法使用。

基本上,如果有人有一个指向 IndyHTTP 的一些不错文档的链接会很棒,因为它似乎很稀疏,

最佳答案

是的,当然它会导致异常。这就是 Indy 的工作方式,这也是 Remy 建议您捕获异常的原因。

您现在感到困惑的是,即使您有捕获异常的代码,Delphi 调试器仍会拦截它们并暂停程序的执行以通知您发生了异常。 I've written about that phenomenon before.

由于您在调试时显然对了解非状态 200 异常不感兴趣 - 因为您的程序旨在自行处理所有这些错误 - 您最好的选择可能是将 EIdHTTPProtocolException 添加到调试器的忽略异常列表中。最简单的方法是在下次调试器通知您时选择“忽略此异常类型”。

关于delphi - TidHTTP 错误处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5287313/

10-10 18:44
查看更多