Раздел 10.3 - Обработка исключений

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

Когда происходит возбуждение исключения (при помощи инструкции raise), Ada прекращает выполнение программы и ищет в последовательности инструкций, в которой исключение было возбуждено, соответствующий обработчик. Последовавтельность инструкций - это множество инструкций между ключевыми словами "begin" и "end". Если Ada не находит соответствующий обработчик, происходит возврат из текущей подпрограммы (с попутным освобождением памяти) и поиск соответствующего обработчика в вызвавшей ее подпрограмме. Если и там обработчик не найден, то происходит выход также и из нее (с попутным освобождением памяти), и поиск повторяется снова до тех пор, пока не будет найден соответствующий обработчик, или пока не произойдет выход из самой программы.

Обработчик исключения описывают непосредственно перед инструкцией "end", соответствующей некоторой инструкции "begin".

В качестве примера ниже приведена процедура, которая открывает файл и, если он не существует, то создает его.

  procedure Open_Or_Create(File : in out File_Type;
                           Mode : File_Mode; Name : String) is
  begin
    -- Попытка открытия файла. Она может привести к возбуждению исключения
    -- Name_Error, если файл не существует.
    Open(File, Mode, Name);
  exception
    when Name_Error =>
      Create(File, Mode, Name);
  end Open_Or_Create;

Далее приведена упрощенная BNF обработчика исключений:

  обработчик_исключения ::= выбор_исключения { "|" выбор_исключения } "=>"  
                            последовательность_инструкций  
  выбор_исключения ::= имя_исключения | "others"

Ключевое слово "others" означает все исключения, явно не перечисленные в этом обработчике; таким образом, можно, если это необходимо, обработать все исключения.

Внутри обработчика исключения можно осуществлять любые желаемые виды обработки. Если после этого необходимо возбудить то же самое исключение с передачей его подпрограмме более высокого уровня, то можно использовать инструкцию "raise" без имени. Инструкция raise с неименованным исключением повторно возбуждает обрабатываемое исключение. Повторное возбуждение исключения с помощью оператора raise возможно только внутри обработчика исключения.

С помощью исключений можно передавать информацию и для этого имеется предопределенный пакет с операциями, связанными с исключениями. Мы не будем обсуждать это сейчас, однако, если вам это интересно, то можете изучить раздел 11 Ada RM, посвященный исключениям.


К этому разделу упражнение отсутствует.

Вы можете перейти к следующему разделу.


Вы можете также:

PREVIOUS Вернуться к предыдущему разделу

OUTLINE  Вернуться к содержанию Урока 10

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s10sf.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org