0

我的问题与我询问的关于从 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;
4

2 回答 2

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;

当 Indy 得到不可接受的响应时,它会引发 type 异常EIdHTTPProtocolException。它不会针对每个可能的失败原因引发不同的异常类,因此请检查ErrorCode属性以获取数字响应。有关各种响应代码的含义,请参阅HTTP 规范

看起来 Indy 可以配置为通过方法的AIgnoreReplies参数忽略某些响应代码TIdCustomHTTP.DoRequest,但我已经追溯了该参数,只要我今天愿意去,所以如果你想了解更多信息,要么问一个新的问题或某人可以编辑此答案以用更完整的内容替换本段。

在上面的示例中,我检查了 404(未找到)并退出。确保不要使用MSifGet引发异常,因为它的内容不确定,而且可能不是有效的 GIF 图像。对于任何其他服务器响应,我重新引发异常,以便调用者可以处理它。你可能想要改变它。任何不是其后代的异常都EIdHTTPProtocolException将自动重新引发。不要捕获您不知道如何解决的错误的异常。

于 2009-09-25T14:56:06.257 回答
0

每次尝试都有一个 问题,在那里你应该处理你的异常可能 创建一个带有一些文本的空白图像图像不可用

于 2009-09-25T13:57:45.317 回答