Delphi - 如果 return 页面未找到错误,则使 Idhttp 运行 循环

Delphi - make the Idhttp run in loop if return page not found error

如果 return 404 页面未找到,我如何使 Idhttp 运行 循环 问题是 'GOTO CheckAgain' 导致进入或退出 TRY 语句

label
  CheckAgain;
begin  
  CheckAgain:
  try
    idhttp.Get(sURL+WebFile[I], S);
  except
    on E: EIdHTTPProtocolException do
    if AnsiPos('404',E.Message) <> 0 then
    begin
      I := I+1;
      goto CheckAgain;
    end;
  end;
end;

作为一般规则,我会避免使用 goto。有些场合应该使用goto,但这种情况很少见,而且你的问题不适合。

while 循环会更常用。您也可以构建最大重试机制。大概是这样的:

RetryCount := 0;
Succeeded := False;
while RetryCount < MaxRetryCount do
  try
    idhttp.Get(sURL+WebFile[I], S);
    Succeeded := True;
    break; // success, break out of while loop
  except
    on E: EIdHTTPProtocolException do
      if E.ErrorCode = 404 then
        inc(RetryCount)
      else
        raise;

  end;

您有三个选择:

  1. 在循环中使用 try/except 块,捕获 EIdHTTPProtocolException 异常并检查它们的 ErrorCode 属性 是否为 404:

    repeat
      try
        IdHttp.Get(sURL+WebFile[I], S);
      except
        on E: EIdHTTPProtocolException do
        begin
          if E.ErrorCode <> 404 then
            raise;
          Inc(I);
          Continue;
        end;
      end;
      Break;
    until False;
    
  2. 如果您使用的是最新版本的 Indy,您可以在 TIdHTTP.HTTPOptions 属性 中启用 hoNoProtocolErrorException 标志,然后您的循环可以删除 try/except 并改为检查 TIdHTTP.ResponseCode 属性:

    repeat
      IdHttp.Get(sURL+WebFile[I], S);
      if IdHttp.ResponseCode <> 404 then
        Break;
      Inc(I);
    until False;
    
  3. 使用具有 AIgnoreReplies 参数的 TIdHTTP.Get() 方法的重载版本,然后您可以告诉 Get() 不要引发 EIdHTTPProtocolException 404 响应异常:

    repeat
      IdHttp.Get(sURL+WebFile[I], S, [404]);
      if IdHttp.ResponseCode <> 404 then
        Break;
      Inc(I);
    until False;