Ответ 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;