我在我的网站上传了一个txt,其中这个txt文件的内容是我的Noip地址,必须通过http请求查询。
下面我的代码中的问题是,如果删除了该文件的网站,则会生成异常而不能执行以下行的函数返回正确的结果。
如何解决?
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
idhttp,
SysUtils;
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
a, b: string;
begin
lHTTP := TIdHTTP.Create(nil);
try
a := lHTTP.Get(aURL);
if lhttp.responsecode = 200 then
begin
Result := a
end
else
begin
b := lHTTP.Get(bURL);
if lHTTP.ResponseCode = 200 then
Result := b
else
Result := 'mydnsname.ddns.net';
end;
finally
lHTTP.Free;
end;
end;
begin
try
GetURLAsString('http://www.mysite01.com/conn.txt','http://www.mysite02.com/conn.txt');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
提前感谢。
修改
GetURLAsString 的结果必须是' mydnsname.ddns.net ',如果有两个请求失败的话。否则,结果必须是我网站上传的txt文件的内容(即 mydnsname.ddns.net )。
答案 0 :(得分:4)
按照设计,如果HTTP服务器返回失败响应代码,TIdHTTP
默认会引发EIdHTTPProtocolException
异常,例如404 NOT FOUND
。
有几种不同的方法可以解决这个问题:
抓住例外:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
try
Result := lHTTP.Get(aURL);
except
try
Result := lHTTP.Get(bURL);
except
Result := 'mydnsname.ddns.net';
end;
end;
finally
lHTTP.Free;
end;
end;
在AIgnoreReplies
Get()
参数中传递404,因此404错误不会引发异常,但仍会引发其他错误:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
Result := lHTTP.Get(aURL, [404]);
if lHTTP.ResponseCode = 200 then Exit;
Result := lHTTP.Get(bURL, [404]);
if lHTTP.ResponseCode = 200 then Exit;
Result := 'mydnsname.ddns.net';
finally
lHTTP.Free;
end;
end;
在hoNoProtocolErrorException
属性中启用HTTPOptions
标志,以便根本不会引发异常:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
lHTTP.HTTPOptions := lHTTP.HTTPOptions + [HoNoProtocolErrorException];
Result := lHTTP.Get(aURL);
if lHTTP.ResponseCode = 200 then Exit;
Result := lHTTP.Get(bURL);
if lHTTP.ResponseCode = 200 then Exit;
Result := 'mydnsname.ddns.net';
finally
lHTTP.Free;
end;
end;