TIdHTTP异常处理

xtupzzrd  于 2022-10-16  发布在  其他
关注(0)|答案(2)|浏览(229)

我创建了一个自动连接到本地服务器并下载更新的程序,代码如下:

// Connect to web server and download ToBeInstalled.ini
Url := 'http://'+IPAdd+'/ToBeInstalled.ini';
MS := TMemoryStream.Create
  try
    try
      http.Get(url, MS);
      code := http.ResponseText;
    except
      on E: EIdHTTPProtocolException do
        code := http.ResponseCode; 
    end;
    MS.SaveToFile(UserPath + 'ToBeInstalled.ini');
  finally
    http.Free();
  end;

该程序在办公室运行得很好,但当用户在家无法访问服务器或服务器不可用时,GET“Socket Error#10061”

我不知道如何捕捉那个错误,更糟糕的是,在显示该错误消息后,程序一起停止执行。你知道怎么解决这个问题吗。非常感谢。

bmp9r5qi

bmp9r5qi1#

您的异常处理程序只专门捕获EIdHTTPProtocolException异常,但也可以引发其他几种类型的异常,包括EIdSocketError。您需要相应地更新您的处理程序,或者只让它捕获所有可能的异常,而不是查找特定类型。既然您说未捕获的异常导致整个应用程序失败(这意味着您有更大的问题要处理,而不仅仅是TIdHTTP),您还应该更新代码以处理由TMemoryStream引发的异常。
试试这个:

// Connect to web server and download ToBeInstalled.ini
Url := 'http://'+IPAdd+'/ToBeInstalled.ini';
try
  MS := TMemoryStream.Create
  try
    http.Get(url, MS);
    code := http.ResponseText;
    MS.SaveToFile(UserPath + 'ToBeInstalled.ini');
  finally
    MS.Free;
  end;
except
  on E: EIdHTTPProtocolException do begin
    code := http.ResponseCode; 
  end;
  on E: Exception begin
    // do something else
  end;
end;
kmynzznz

kmynzznz2#

我是这样用的:

uses
  IdStack, IdStackConsts;
Result.ResponseCode:= -1;
  try
    Result.Content:= FHTTP.Get(Url);   
    Result.ResponseCode:= FHTTP.ResponseCode;
  except
    on E: EIdSocketError do
        begin
          case e.LastError of
            Id_WSAETIMEDOUT:
              begin
                Result.ResponseCode:= 408;
                Result.Message:= 'زمان ارتباط به پایان رسید';
              end;
            Id_WSAEACCES:
              begin
                Result.ResponseCode:= 403;
                Result.Message:= 'دسترسی وجود ندارد';
              end;
            else
              begin
                Result.ResponseCode:= e.LastError;
                Result.Message:= e.Message;
              end;
          end;
        end;
      on E: Exception do
        Result.Content:= E.ClassName + ': ' + E.Message;
  end;

相关问题