Как проверить URL с помощью IdHTTP?

Как я могу проверить целевой URL для конкретного кода ответа, например, 200 OK, если Indy не выбрасывает всевозможные исключения. ConnectionTimeout, ConnectionClosedGracefully и т.д.

Например, если URL-адрес не является правильным или его хост не может быть найден или недоступен. Indy по-прежнему будет генерировать исключения, хотя я пытался игнорировать их.

Поэтому мой вопрос заключается в том, как правильно игнорировать эти исключения.

Ответ 1

1. Как игнорировать все исключения, отбрасываемые TIdHTTP?

Чтобы обрабатывать все исключения и, как вы говорите, игнорировать их, вы можете использовать код, который почти идентичен коду из ответа @Stijn:

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create;
  try
    try
      IdHTTP.Get('http://www.example.com');
    except
      // do just nothing here, if you really want to completely ignore all 
      // exceptions thrown from inside the try..except block execution and
      // if you don't want to indicate somehow, that the exception occured
    end;
  finally
    IdHTTP.Free;
  end;
end;

2. Как обрабатывать конкретные исключения, заданные TIdHTTP?

Возможно, однажды вам захочется как-то отреагировать на определенные типы исключений, отбрасываемых классом TIdHTTP, например. реагировать только на исключения HTTP-протокола. И вот что я попытаюсь здесь проработать.

Indy определяет множество классов исключений для разных случаев, которые могут возникать, когда определенное действие терпит неудачу. Вот список классов исключений, которые могут вас заинтересовать, когда вы работаете с протоколом HTTP:

  • EIdException - это базовый класс исключений, используемый библиотекой Indy. Это может быть полезно для вас, когда вы хотите различать исключения, вызванные Indy, и все другие исключения, которые вы выбрали приложением.

  • EIdSocketError - из точки абстракции HTTP-протокола это класс исключения низкого уровня, который охватывает все исключения, возникающие, когда некоторая операция сокета не выполняется. Это может быть полезно для вас обнаружить, что на вашем сетевом уровне что-то не так.

  • EIdConnClosedGracefully - исключения, поднятые этим классом, указывают, что серверная сторона закрыла соединение с клиентом обычным способом, Это может быть полезно, когда вам нужно будет реагировать на эту ситуацию, например. путем повторного подключения к серверу.

  • EIdHTTPProtocolException - этот класс исключений используется для исключений, возникающих при возникновении ошибки при обработке HTTP-ответа для определенный запрос. Обычно это происходит, когда из ответа HTTP получен неожиданный числовой код ответа HTTP. Это может быть полезно, если вы хотите конкретно обрабатывать ошибки протокола HTTP. Благодаря этой обработке исключений вы можете, например, реагировать на определенные коды состояния HTTP, возвращаемые ответом сервера.

Вот скелет кода, показывающий обработку исключений, перечисленных выше. Конечно, вам не нужно показывать сообщения, но делать что-то более полезное. И вам не нужно обращаться со всеми из них; это на вас какие исключения и как вы будете обращаться:

uses
  IdHTTP, IdException, IdStack;

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create;
  try
    try
      IdHTTP.Get('http://www.example.com');
    except
      // this exception class covers the HTTP protocol errors; you may read the
      // response code using ErrorCode property of the exception object, or the
      // same you can read from the ResponseCode property of the TIdHTTP object
      on E: EIdHTTPProtocolException do
        ShowMessage('Indy raised a protocol error!' + sLineBreak +
          'HTTP status code: ' + IntToStr(E.ErrorCode) + sLineBreak +
          'Error message' + E.Message);
      // this exception class covers the cases when the server side closes the
      // connection with a client in a "peaceful" way
      on E: EIdConnClosedGracefully do
        ShowMessage('Indy reports, that connection was closed gracefully!');
      // this exception class covers all the low level socket exceptions
      on E: EIdSocketError do
        ShowMessage('Indy raised a socket error!' + sLineBreak +
          'Error code: ' + IntToStr(E.LastError) + sLineBreak +
          'Error message' + E.Message);
      // this exception class covers all exceptions thrown by Indy library
      on E: EIdException do
        ShowMessage('Indy raised an exception!' + sLineBreak +
          'Exception class: ' + E.ClassName + sLineBreak +
          'Error message: ' + E.Message);
      // this exception class is a base Delphi exception class and covers here
      // all exceptions different from those listed above
      on E: Exception do
        ShowMessage('A non-Indy related exception has been raised!');
    end;
  finally
    IdHTTP.Free;
  end;
end;

Ответ 2

Обычный try/except должен сделать трюк:

try
  IdHttp1.Get(...);
  Result:=IdHttp1.ResponseCode=200;
except on EIdException do
  Result:=false;
end;