【问题标题】:loading image from URL - How to capture the exception if the image is not there从 URL 加载图像 - 如果图像不存在,如何捕获异常
【发布时间】:2010-12-01 10:26:54
【问题描述】:

我的问题与other question I have asked about loading image from the 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;

【问题讨论】:

    标签: delphi http exception-handling indy


    【解决方案1】:

    如何捕获异常?与捕获任何其他异常的方式相同。使用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 收到不可接受的响应时,它会引发 EIdHTTPProtocolException 类型的异常。它不会针对每个可能的失败原因引发不同的异常类,因此请检查 ErrorCode 属性以获取数字响应。各种响应码的含义请参考HTTP spec

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

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

    【讨论】:

    • 谢谢你,Rob,我不知道如何申请,你的例子解决了我的问题。我真的很感激。克里斯
    【解决方案2】:

    每次尝试都有一个捕获
    这是您应该处理异常的地方
    可能会创建一个带有一些文本的空白图像图像不可用

    【讨论】:

    • 嗯,不,在 Delphi 中它拼写为 except,而不是 catch,而且并非每个 try 都有一个。其中一些,如问题所示,有一个finally
    猜你喜欢
    • 2012-11-08
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2011-10-03
    相关资源
    最近更新 更多