Indy和REST - 我可以防止例外吗?

Dav*_*way 4 delphi rest indy delphi-xe2

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

我对IgnoreReplies数组的理解是,它会阻止这些状态再次出现,但这不是我想要的.我希望所有状态都回来,而且没有一个可以引发异常.例如,有大量REST服务返回404,这被认为是完全"有效"的响应.

我真的不想在异常处理程序中使用我的代码的1/2,所以有没有办法让当前的Indy只返回一切?

Rem*_*eau 10

抱歉,您必须使用该IgnoreReplies参数来告知TIdHTTP哪些特定的HTTP回复代码不会引发异常.目前没有办法告诉TIdHTTP不要为所有可能的回复提出异常.如果你想收到一个不成功的回复,比如404,没有提出异常那么你必须告诉TIdHTTP它,例如:

IdHTTP.Get('http://host/path', [404]);
Run Code Online (Sandbox Code Playgroud)

请注意,此语法仅适用于GET请求,而不适用于其他请求POST(除非您TIdHTTP.DoRequest()直接调用受保护的方法).

Indy专门针对异常处理而设计.如果你想有效地使用Indy,你必须接受异常,而不是避免它们.包裹TIdHTTP.Get()TIdHTTP.Post()在小块中有什么麻烦try/except?如果您不想处理所有可能的异常,那么您可以单独使用except块句柄EIdHTTPProtocolException.

try
  IdHTTP.Get('http://host/path');
except
  on E: EIdHTTPProtocolException do
  begin
    if E.ErrorCode <> 404 then Raise;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

更新:考虑更多,可能值得为TIdHTTP.HTTPOptions属性添加新标志以禁用所有状态代码的异常.我在考虑它.

更新:hoNoProtocolErrorException现在已向该TIdHTTP.HTTPOptions属性添加了新标志:

IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP.Get('http://host/path');
// use IdHTTP.ResponseCode as needed...
Run Code Online (Sandbox Code Playgroud)

更新:此外,还有hoWantProtocolErrorContent一面旗帜.当hoNoProtocolErrorException启用并发生HTTP错误时,如果hoWantProtocolErrorContent启用,则错误内容将返回给调用者(在String返回值或AResponseContent输出流中,具体取决于调用Get()/的版本Post()),否则内容将是丢弃.

  • "如果你想有效地使用Indy,你必须接受例外而不是避免它们",不幸的是.为什么这很麻烦?因为提出和处理异常不应该是正常程序流程的一部分.在OP的上下文中接收404是正常的程序流程,而不是特殊情况.同样麻烦,因为(在Win32上)提升和处理异常会很难达到性能. (3认同)