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;
您有三个选择:
在循环中使用 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;
如果您使用的是最新版本的 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;
使用具有 AIgnoreReplies
参数的 TIdHTTP.Get()
方法的重载版本,然后您可以告诉 Get()
不要引发 EIdHTTPProtocolException
404 响应异常:
repeat
IdHttp.Get(sURL+WebFile[I], S, [404]);
if IdHttp.ResponseCode <> 404 then
Break;
Inc(I);
until False;
如果 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;
您有三个选择:
在循环中使用
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;
如果您使用的是最新版本的 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;
使用具有
AIgnoreReplies
参数的TIdHTTP.Get()
方法的重载版本,然后您可以告诉Get()
不要引发EIdHTTPProtocolException
404 响应异常:repeat IdHttp.Get(sURL+WebFile[I], S, [404]); if IdHttp.ResponseCode <> 404 then Break; Inc(I); until False;