Delphi-如果返回页未找到,则使Idhttp在循环中运行错误

Delphi-如果返回页未找到,则使Idhttp在循环中运行错误,delphi,idhttp,Delphi,Idhttp,如果未找到return404页面,如何使Idhttp在循环中运行 问题是“gotocheckreach”导致TRY语句进入或退出 标签 再次检查; 开始 再次检查: 尝试 Get(sURL+WebFile[I],S); 除了 关于E:EIdHTTPProtocolException do 如果AnsiPos('404',E.Message)为0,则 开始 I:=I+1; 再次去检查; 结束; 结束; 结束; 一般来说,我会避免使用goto。在某些情况下,应该使用goto,但这种情况很少见,而且您

如果未找到return404页面,如何使Idhttp在循环中运行 问题是“gotocheckreach”导致TRY语句进入或退出

标签
再次检查;
开始
再次检查:
尝试
Get(sURL+WebFile[I],S);
除了
关于E:EIdHTTPProtocolException do
如果AnsiPos('404',E.Message)为0,则
开始
I:=I+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;
RetryCount:=0;
成功:=假;
而RetryCount
一般来说,我会避免使用
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;
RetryCount:=0;
成功:=假;
而RetryCount
您有三个选项:

  • 在循环中使用
    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;
    
  • 使用具有
    aignoreplies
    参数的
    TIdHTTP.Get()
    方法的重载版本,然后您可以告诉
    Get()
    不要在404响应上引发
    EIdHTTPProtocolException
    异常:

    repeat
      IdHttp.Get(sURL+WebFile[I], S, [404]);
      if IdHttp.ResponseCode <> 404 then
        Break;
      Inc(I);
    until False;
    
    重复
    Get(sURL+WebFile[I],S[404]);
    如果IdHttp.ResponseCode 404,则
    打破
    公司(一);
    直到错误;
    

  • 您有三种选择:

  • 在循环中使用
    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;
    
  • 使用具有
    aignoreplies
    参数的
    TIdHTTP.Get()
    方法的重载版本,然后您可以告诉
    Get()
    不要在404响应上引发
    EIdHTTPProtocolException
    异常:

    repeat
      IdHttp.Get(sURL+WebFile[I], S, [404]);
      if IdHttp.ResponseCode <> 404 then
        Break;
      Inc(I);
    until False;
    
    重复
    Get(sURL+WebFile[I],S[404]);
    如果IdHttp.ResponseCode 404,则
    打破
    公司(一);
    直到错误;
    

  • 为True时,如果其时间停止,则执行中断操作,或者只是想做点什么的时候
    注意不要解析异常消息;
    EIdHTTPProtocolException
    异常具有
    ErrorCode
    成员。@TLama感谢
    ,而WantTortryagain做了一些事情
    效果很好,关于异常消息
    EIdHTTPProtocolException
    ,我不理解这意味着代码上下文中的
    E
    变量也包含包含(已解析)错误代码的
    ErrorCode
    成员。关于它的更多信息,你可能会在中找到,例如,
    而True do if it timetostop then Break,或者只是想做点什么的时候
    注意不要解析异常消息;
    EIdHTTPProtocolException
    异常具有
    ErrorCode
    成员。@TLama感谢
    ,而WantTortryagain做了一些事情
    效果很好,关于异常消息
    EIdHTTPProtocolException
    ,我不理解这意味着代码上下文中的
    E
    变量也包含包含(已解析)错误代码的
    ErrorCode
    成员。关于它的更多信息,你可能会在中找到。