Глубины Indy


Обработка исключений


Обработка исключений в клиентах Indy такая же как с файлами. Если ошибка возникнет во время выполнения любого метода Indy, то будет возбуждено соответствующее исключение. Для обработки исключения код надо помещать в блоки try..finally или try..except blocks.

Также отсутствует событие OnError, так что не ищите его. Это может показаться странным, если вы уже работали с другими сокетными библиотеками, но посмотрите на TFileStream,  он также не имеет события OnError, просто если есть проблема, то возбуждается исключение. Indy работает подобным образом.

Подобно тому, как все открытые файлы должны быть закрыты, все вызовы Connect в Indy должны быть закрытым вызовом метода Disconnect. Базовые клиенты должны начитать работу следующим образом:

Client.Connect;

try

  // Perform read/write here

finally

  Client.Disconnect;

end;

Исключения Indy только слегка отличаются от исключений VCL, все исключения Indy наследуются от EIdException. Если вы желаете обрабатывать исключения Indy отдельно от исключений VCL, то это можно сделать, как в следующем примере.

Примечание: Для использования EIdException вы должны добавить IdException в uses.

try

  Client.Connect;

  try

    // Perform read/write here

  finally

    Client.Disconnect;

  end;

except

  on E: EIdException do

  begin

    ShowMessage('Communication Exception: ' + E.Message);

  end

  else

  begin

    ShowMessage('VCL Exception: ' + E.Message);

  end;

end;

Если произойдет ошибка во время вызова метода Connect, то она будет очищена самостоятельно перед возбуждения  соответствующего исключения. Поэтому, try здесь после вызова метода Connect на не перед. Тем не менее, если исключение случится во время передачи данных, то будет возбуждено исключение raised. Сокет останется подсоединенным. Это позволяет вам повторить операцию передаче или отсоединиться. В приведенном выше примере, не делается никакой дополнительной обработки и сокет отсоединяется по любой ошибке, и производится нормальное завершение.

Для обработки ошибок во время соединения и отделения от других ошибок связи, требуется изменить ваш код:

try

  IdTCPClient1.Connect;

  try

    try

      // Do your communications here

    finally

      IdTCPClient1.Disconnect;

    end;

  except

    on E: EIdException do

    begin

      ShowMessage('An network error occurred during communication: ' + E.Message);

    end;

    on E: Exception do

    begin

      ShowMessage('An unknown error occurred during communication: ' + E.Message);

    end;

  end;

except

  on E: EIdException do

  begin

    ShowMessage('An network error occurred while trying to connect: ' + E.Message);

  end;

  on E: Exception do

  begin

    ShowMessage('An unknown error occurred while trying to connect: ' + E.Message);

  end;

end;

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




Начало  Назад  Вперед