TidHTTP错误处理

时间:2011-03-13 03:58:47

标签: delphi indy idhttp

我正在编写一个程序来对网站进行检查以测试它们当前的状态,例如: 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变量在线程构造函数中设置,status变量是整个线程的变量。

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

最终的结果我正在寻找它,根据网站是否在线或有错误(例如HTML返回代码)给我一个返回,当网站不存在时另外提供反馈(例如非注册网址)或只是无法联系。

我正在寻找的其他建议是如何从请求中获取更多信息。特别是目前我还希望得到被检查网站的IP。

让它工作而不需要在任何URL之前使用http://也是很好的,所以例如www.google.com将会工作,因为它不是因为未知的协议。

基本上如果有人链接到IndyHTTP的一些很好的文档会很好,因为它似乎很稀疏,

1 个答案:

答案 0 :(得分:7)

是的,当然会引起异常。这就是Indy的工作原理,这就是为什么Remy建议你捕捉异常的原因。

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

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