Инди и остальные-могу ли я предотвратить исключения?
Есть ли способ предотвратить инди от создания исключений для любого / всех статусов HTTP?
Мое понимание массива IgnoreReplies заключается в том, что он будет препятствовать тому, чтобы эти статусы когда-либо возвращались, но это не то, что я хочу. Я хочу, чтобы все статусы возвращались, и ни один из них не вызывал исключения. Есть много служб REST, которые возвращают 404, например, и это считается совершенно "допустимым" ответом.
Я действительно не хочу, чтобы 1/2 моего кода содержалось в обработчиках исключений, поэтому есть способ заставить нынешнего инди просто вернуть все?
1 ответ:
Извините, но вы должны использовать параметр
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;
Update: подумав об этом больше, возможно, стоит добавить новый флаг в
TIdHTTP.HTTPOptions
свойство для отключения исключения для всех кодов состояния. Я подумываю об этом.Update : новый флаг
hoNoProtocolErrorException
теперь добавлен к свойствуTIdHTTP.HTTPOptions
:IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException]; IdHTTP.Get('http://host/path'); // use IdHTTP.ResponseCode as needed...
Update : кроме того, существует также флаг
hoWantProtocolErrorContent
. КогдаhoNoProtocolErrorException
включен и возникает ошибка HTTP, еслиhoWantProtocolErrorContent
включен, то содержимое ошибки будет возвращено вызывающему объекту (либо в возвращаемом значенииString
, либо в выходном потокеAResponseContent
, в зависимости от версииGet()
/Post()
есть вызывается), в противном случае содержимое будет отброшено.