2011-03-13 138 views
4

我正在编写一个程序在网站上执行检查以测试它们是当前状态,例如, 200 OK。我使用Delphi 2010附带的Indy HTTP来执行此任务并获得当前代码。TidHTTP错误处理

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变量是整个主题的变量。

的尝试,除了这部分代码来自人头马勒博 - TeamB here这是我提出的问题时,最初这个想法摆弄周围。我遇到的问题是,该代码只适用于网站返回200 OK代码的情况。任何其他事情都会导致异常,包括如果我禁用互联网。这也会导致例如重定向的网站例外。 www.google.com会在调试过程中导致异常,我认为会导致它重定向到www.google.co.uk,但是如果我继续超出异常,那么它将返回301 FOUND代码而不会出现任何问题。

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

我正在寻找的其他建议的忠告是如何从请求中获得更多信息。具体来说,我现在正在寻找也检查过的网站的IP。

如果不需要在任何URL之前加上http://,它也可以很好地工作,所以例如www.google.com将会工作,而目前它并不是因为未知的协议。

基本上这将是巨大的,如果有人有一个链接,为IndyHTTP一些不错的文档,因为它似乎是稀疏,

+0

它看起来像你的状态分配后,异常处理程序是错位的......你也忽略@Remy建议使用头部方法,而不是整个只是了解服务器返回的状态。另外,你正在使用ResponseText来检查站点的* status *,注意INDY为你解析这个,并给你很好的ResponseCode整型属性来检查响应。最后,你说异常被提出,但你不会告诉我们哪个异常,所以通过阅读代码很难弄清楚发生了什么。 – jachguate 2011-03-14 17:02:04

+0

@jachguate我现在已经更新了代码以反映.head方法。我已经改变了它,正在下载网站的页面,但已经搁置,刚才。异常处理程序以何种方式错位?另外,如果我更改为使用ResponseCode方法,则发生套接字错误时会发生什么情况,例如站点无法到达。例外beign的问题随着它们的剧烈变化而产生,其中一些是套接字错误,一些例外,例如返回。 HTTP/1的例外。1 302找到 – jskrwyk 2011-03-17 02:08:53

+0

异常处理程序没有放错地方,你在异常处理程序后执行的状态分配对我来说是没有意义的。关于这里提出的各种例外......它不是太大......你可以通过检查得到更多有关各种失败原因的知识,而且你可以微调你的软件来相应地管理和报告,知识。 – jachguate 2011-03-18 17:15:32

回答

7

是的,当然它会导致异常。这就是Indy的工作原理,这就是为什么Remy建议你去捕捉异常情况。

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

既然你显然没有兴趣了解无身份-200的异常,而你正在调试 - 因为你的程序是专门用来处理所有这些错误本身 - 你最好的选择可能是添加EIdHTTPProtocolException调试器的被忽略的例外列表。最简单的方法是在下次调试器通知您时选择“忽略此异常类型”。

+0

再次感谢罗伯。关于异常处理和提升的非常有趣的文章。 – jskrwyk 2011-03-16 16:34:48

+0

在地址的开头缺少'http://',也是此例外的原因 – none 2012-11-01 14:16:18