有没有办法阻止Indy在任何/所有HTTP状态上引发异常?
我对IgnoreReplies数组的理解是,它会阻止这些状态再次出现,但这不是我想要的。我希望所有状态都回来,而且没有一个可以引发异常。例如,有大量REST服务返回404,这被认为是完全“有效”的响应。
我真的不想在异常处理程序中使用1/2的代码,那么有没有办法让当前的Indy返回所有内容?
答案 0 :(得分:10)
很抱歉,您必须使用IgnoreReplies
参数告诉TIdHTTP
哪些特定的HTTP回复代码不会引发异常。目前无法告诉TIdHTTP
一般不会针对所有可能的回复引发异常。如果您希望收到不成功的回复,例如404,而不提出异常,那么您必须告诉TIdHTTP
,例如:
IdHTTP.Get('http://host/path', [404]);
请注意,此语法仅适用于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;
更新:考虑更多,可能值得为TIdHTTP.HTTPOptions
属性添加新标志以禁用所有状态代码的例外。我在考虑它。
更新:新的hoNoProtocolErrorException
标记现已添加到TIdHTTP.HTTPOptions
属性中:
IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP.Get('http://host/path');
// use IdHTTP.ResponseCode as needed...
更新:此外,还有一个hoWantProtocolErrorContent
标志。启用hoNoProtocolErrorException
并发生HTTP错误时,如果启用了hoWantProtocolErrorContent
,则错误内容将返回给调用方(String
返回值或AResponseContent
输出流,取决于正在调用的Get()
/ Post()
版本,否则将丢弃内容。