Инди и остальные-могу ли я предотвратить исключения?
Есть ли способ предотвратить инди от создания исключений для любого / всех статусов 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блок? Если вы не хотите обрабатывать все возможные исключения, то вы можете иметь дескриптор БлокаexceptEIdHTTPProtocolExceptionсам по себе.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()есть вызывается), в противном случае содержимое будет отброшено.