Delphi Indy和REST-我可以防止异常吗?

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不要对所有

有没有办法防止Indy在任何/所有HTTP状态上引发异常

我对IgnoreReplies数组的理解是,它将阻止这些状态再次出现,但这不是我想要的。我希望所有状态都返回,并且没有一个会引发异常。例如,有很多REST服务返回404,这被认为是一个完全“有效”的响应


我真的不想在异常处理程序中包含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
标志也可以。@Jerrydoge
hoWantProtocolErrorContent
是。您必须或者处理
EIdHTTPProtocolException
属性中包含错误内容的
ErrorMessage
属性
IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP.Get('http://host/path');
// use IdHTTP.ResponseCode as needed...