0

如果找不到返回 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;
4

2 回答 2

3

你有三个选择:

  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,您可以hoNoProtocolErrorException在属性中启用该标志TIdHTTP.HTTPOptions,然后您的循环可以删除try/except并检查该TIdHTTP.ResponseCode属性:

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

    repeat
      IdHttp.Get(sURL+WebFile[I], S, [404]);
      if IdHttp.ResponseCode <> 404 then
        Break;
      Inc(I);
    until False;
    
于 2015-06-12T06:46:56.360 回答
1

作为一般规则,我会避免使用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;
于 2015-06-12T06:35:42.400 回答