TidHTTP错误处理

4

我正在编写一个程序,以检查网站的状态,例如200 OK。我在使用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变量在线程构造函数中设置,status变量是整个线程的变量。
这段代码中的try和except部分来自Remy Lebeau - TeamB 这里,这是我最初尝试这个想法时提出的问题。我的问题在于,只有当网站返回200 OK代码时,此代码才能正常工作。任何其他情况都会引发异常,包括我禁用互联网时也会引发异常。这还会导致重定向的网站引发异常,例如www.google.com在调试期间会引发异常,我猜测这是因为它正在将我重定向到www.google.co.uk,但是如果我继续通过异常,那么它将返回301 FOUND代码而没有任何问题。
我要找到的最终结果是根据网站是否在线或出现错误(例如HTML返回代码)给我返回,同时在网站不存在(例如未注册的URL)或无法联系时提供反馈。
我要寻求的其他建议是如何从请求中获取更多信息。具体来说,目前我还想获得已检查网站的IP。
此外,让它在不需要在任何URL之前添加http://的情况下工作也很好,因此例如www.google.com将起作用,目前由于未知协议而无法使用。
基本上,如果有人提供IndyHTTP的一些好文档链接,那将是很棒的,因为它似乎很稀少。

看起来你在异常处理程序之后的状态赋值放错了位置... 你还忽略了 @Remy 的建议,使用 head 方法而不是整个 get 方法只为了知道服务器返回的状态。 此外,你正在使用 ResponseText 来检查站点的 状态,请注意 INDY 会为你解析它并给出漂亮的 ResponseCode 整数属性来检查响应。 最后,你说有一个异常被引发,但你没有告诉我们是哪个异常,所以仅通过阅读代码很难弄清楚这里发生了什么。 - jachguate
@jachguate 我现在已经更新了代码以反映.head方法。我曾经更改过它,因为我正在玩下载网站页面的东西,但是现在已经搁置了。异常处理程序错放的方式是什么?此外,如果我改用ResponseCode方法,在套接字错误的情况下会发生什么,例如无法访问网站。异常被引发的问题是它们变化巨大,有些是套接字错误,有些在返回时引发异常,例如HTTP/1.1 302 Found的异常。 - Flatlyn
异常处理程序没有错放,你在异常处理程序之后进行的状态分配是我不理解的。关于这里引发的各种异常...并不是太多...通过检查它,你可以更好地了解失败原因的多样性,并且随着你获得这些知识,你可以调整你的软件来管理和相应地报告这些问题。 - jachguate
1个回答

7
当然会引起异常。这就是Indy的工作方式,也是Remy建议您捕获异常的原因。
你现在感到困惑的是,即使你有捕获异常的代码,Delphi调试器仍会拦截它们并暂停程序的执行,通知您发生了异常。我之前写过关于这种现象的文章。 由于您显然不想在调试时了解非状态200异常的情况 - 因为您的程序旨在自行处理所有这些错误 - 您最好的选择可能是将 EIdHTTPProtocolException 添加到调试器忽略异常列表中。最简单的方法是在调试器下次通知您时选择“忽略此异常类型”。

再次感谢你,罗布。关于异常处理和抛出方面的文章非常有趣。 - Flatlyn
地址开头缺少“http://”也是导致此异常的原因之一。 - none

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接