2011-03-13 140 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