2009-09-25 71 views
0

我的問題與other question I have asked about loading image from the URL有關。下面的代碼工作。 但是,如果我嘗試獲取圖像(它假設存在),但我已遇到問題,但顯然已刪除 。應用程序不知道並返回錯誤。 有沒有辦法通過捕獲傳入的錯誤來防止它。 我將不勝感激任何建議。 它發生在他行:從URL加載圖像 - 如果圖像不存在,如何捕獲異常

IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS); 

謝謝, 克里斯

uses 
    GIFImg; 

procedure TForm1.btn1Click(Sender: TObject); 
var 
    MS : TMemoryStream; 
    GIf: TGIFImage; 
begin 
    MS := TMemoryStream.Create; 
    GIf := TGIFImage.Create; 
    try 
    IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS); 
    Ms.Seek(0,soFromBeginning);  
    Gif.LoadFromStream(MS); 
    img1.Picture.Assign(GIF); 

    finally 
    FreeAndNil(GIF); 
    FreeAndNil(MS); 
    end; 
end; 

回答

7

你如何捕獲異常?捕獲任何其他異常的方式也是如此。使用try - except塊。

procedure TForm1.btn1Click(Sender: TObject); 
var 
    MS : TMemoryStream; 
    Gif: TGIFImage; 
begin 
    MS := TMemoryStream.Create; 
    try 
    Gif := TGIFImage.Create; 
    try 
     try 
     IdHTTP1.Get('http://www.google.com/intl/en_ALL/images/logo.gif', MS); 
     except 
     on e: EIdHTTPProtocolException do begin 
      if e.ErrorCode = 404 then begin 
      // not found 
      exit; 
      end else begin 
      // some other reason for failure 
      raise; 
      end; 
     end; 
     end; 
     MS.Position := 0; 
     Gif.LoadFromStream(MS); 
     img1.Picture.Assign(Gif); 
    finally 
     Gif.Free; 
    end; 
    finally 
    MS.Free; 
    end; 
end; 

當印地得到一個不可接受的響應,它提出了EIdHTTPProtocolException類型的異常。它不會針對每種可能的失敗原因提出不同的異常類別,因此請檢查ErrorCode屬性以獲取數字響應。請參閱HTTP spec瞭解各種響應代碼的含義。

它看起來像印可以配置通過AIgnoreReplies參數TIdCustomHTTP.DoRequest方法忽略某些響應代碼,但我已經追查該參數追溯到我願意今天去所以如果你想了解更多信息要麼提出一個新問題,要麼有人可以編輯這個答案,用更完整的東西來替代這個段落。

在我上面的例子中,我檢查了404(未找到)並退出。請確保你不使用MS如果Get引發異常,因爲它會有不確定的內容,並且可能不是有效的GIF圖像。對於任何其他服務器響應,我重新提出異常,以便調用者可以處理它。你可能會想改變它。任何不是EIdHTTPProtocolException的後代的異常都會自動重新提升。不要捕捉您不知道如何解決的錯誤的例外情況。

+0

謝謝羅布, 我不知道如何申請除了和你的例子解決了我的問題。 我真的很感激。 Chris – Greener 2009-09-25 15:27:59

0

每個嘗試有
它是存在的,你應該把你的異常
可能創造一個地方有一些文字的空白圖像圖片不可用

+4

呃,不,在德爾福它的拼寫*除*,不* catch *,並不是每個'try'都有。如問題所示,其中一些人有一個'終於',而不是。 – 2009-09-25 14:38:46