Инди и остальные-могу ли я предотвратить исключения?


Есть ли способ предотвратить инди от создания исключений для любого / всех статусов HTTP?

Мое понимание массива IgnoreReplies заключается в том, что он будет препятствовать тому, чтобы эти статусы когда-либо возвращались, но это не то, что я хочу. Я хочу, чтобы все статусы возвращались, и ни один из них не вызывал исключения. Есть много служб REST, которые возвращают 404, например, и это считается совершенно "допустимым" ответом.

Я действительно не хочу, чтобы 1/2 моего кода содержалось в обработчиках исключений, поэтому есть способ заставить нынешнего инди просто вернуть все?

1 4

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() есть вызывается), в противном случае содержимое будет отброшено.