Delphi Indy和REST-我可以防止异常吗?
有没有办法防止Indy在任何/所有HTTP状态上引发异常 我对IgnoreReplies数组的理解是,它将阻止这些状态再次出现,但这不是我想要的。我希望所有状态都返回,并且没有一个会引发异常。例如,有很多REST服务返回404,这被认为是一个完全“有效”的响应Delphi Indy和REST-我可以防止异常吗?,delphi,rest,delphi-xe2,indy,Delphi,Rest,Delphi Xe2,Indy,有没有办法防止Indy在任何/所有HTTP状态上引发异常 我对IgnoreReplies数组的理解是,它将阻止这些状态再次出现,但这不是我想要的。我希望所有状态都返回,并且没有一个会引发异常。例如,有很多REST服务返回404,这被认为是一个完全“有效”的响应 我真的不想在异常处理程序中包含1/2的代码,所以有没有办法让当前的Indy只返回所有内容?对不起,但是您必须使用ignorerepries参数告诉TIdHTTP哪些特定的HTTP应答代码不引发异常。目前没有办法告诉TIdHTTP不要对所有
我真的不想在异常处理程序中包含1/2的代码,所以有没有办法让当前的Indy只返回所有内容?对不起,但是您必须使用
ignorerepries
参数告诉TIdHTTP
哪些特定的HTTP应答代码不引发异常。目前没有办法告诉TIdHTTP
不要对所有可能的回复提出异常。如果您希望在不引发异常的情况下接收非成功回复(如404),则必须告诉TIdHTTP
,例如:
IdHTTP.Get('http://host/path', [404]);
请注意,此语法仅适用于GET
请求,而不适用于其他请求,如POST
(除非您直接调用受保护的TIdHTTP.DoRequest()
方法)
Indy是专门围绕异常处理而设计的。如果你想有效地使用Indy,你必须接受例外,而不是回避它们。在一个小的
try/except
块中包装TIdHTTP.Get()
或TIdHTTP.Post()
,有什么这么麻烦的?如果您不想处理所有可能的异常,那么可以让except
块句柄EIdHTTPProtocolException
自行处理
try
IdHTTP.Get('http://host/path');
except
on E: EIdHTTPProtocolException do
begin
if E.ErrorCode <> 404 then Raise;
end;
end;
更新:此外,还有一个
hoWantProtocolErrorContent
标志。当启用了hoNoProtocolErrorException
且出现HTTP错误时,如果启用了hoWantProtocolErrorContent
,则错误内容将返回给调用者(以字符串
返回值或AresOnSecontent
输出流的形式,具体取决于Get()
/Post的版本)()
正在被调用),否则内容将被丢弃。..“如果你想有效地使用Indy,你必须接受异常,而不是避免它们”不幸的是,是的。为什么这么麻烦?因为引发和处理异常不应该是正常程序流的一部分。在OP的上下文中接收404是正常程序流,而不是异常情况。也很麻烦,因为(在Win32上)引发和处理异常对性能的影响相当大。将此标记为已接受的答案。Remy,感谢您考虑/更改此问题。正如Marjan所提到的,在一个位置有一个case语句,在Exception块中有另一个case语句,将导致非常难看的代码-此添加将完美解决此问题。再次感谢!不,IgnoreResponses
此时仅适用于Get()
和DoRequest()
。但是TIdHTTP.HTTPOptions
属性中的hoNoProtocolErrorException
标志可与Post()一起使用
。hoWantProtocolErrorContent
标志也可以。@JerrydogehoWantProtocolErrorContent
是。您必须或者处理EIdHTTPProtocolException
属性中包含错误内容的ErrorMessage
属性
IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP.Get('http://host/path');
// use IdHTTP.ResponseCode as needed...