Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 145
Текст из файла (страница 145)
13.3.4. Другив ировктныв рвнзвнив Язык Ада предусматривает пять встроенных исключительных ситуаций: СОНЯТВА1НТ ЕККОК НРМЕВ1С ЕВКОК РКОСРАМ ЕКВОК ЯТОВАСЕ ЕККОК ТАЯК1НС ЕККОК Каждая из них в действительности является целой категорией исключительных ситуаций. Например, исключительная ситуация СО(ЧЯТКА1НТ ЕККОК возбуждается, когда индекс массива выходит за пределы допустимого диапазона; когда возникает ошибка, связанная с выходом за пределы допустимого диапазона числовой переменной, имеющей ограниченный диапазон изменения: когда производится ссылка на поле записи, отсутствующее в выделенном объединении, и в некоторых других ситуациях.
Исключительные ситуации. определенные пользователем, можно задавать с помощью объявления следующего вида; список имен исключительных ситуаций: ехсерсдоп Глава 13. Обработка исключительных ситуаций Такие исключительные ситуации обрабатываются точно так же, как и встроенные, за исключением того, что они должны возбуждаться явно. Для встроенных исключительных ситуаций предусмотрены обработчики по умолчанию, каждый их которых приводит к прекращению выполнения программы.
Исключительные ситуации явно возбуждаются оператором кахве, имеющим следующий вид: гаазе [имя исключительной ситуации) Единственным местом, где оператор кахве может появляться без указания имени исключительной ситуации, является обработчик исключительной ситуации. В этом случае оператор казве повторно возбуждает ту исключительную ситуацию. которая привела к выполнению обработчика. Следствием является передача исключительной ситуации в соответствии с правилами, описанными выше. Оператор кахве в обработчике исключительной ситуации используется. если нужно вывести сообщение об ошибке в точке, в которой возникла исключительная ситуация.
а обрабатывать ее где-нибудь в другом месте. Прагма в языке Ада является директивой компилятору. Некоторые проверки во время выполнения программы, являющиеся частями встроенных исключительных ситуаций, могут быть заблокированы в программах на языке Аг)а с помощью прагмы ЯОРРВЕЯЯ, простой вид которой приведен ниже: ркаува БОРРКЕЯЯ(имя проверки) Директива рхауаа ЯУРРКЕЯЯ появляется только в разделах объявлений. При этом указанная в директиве проверка может быть отложена в соответствующем блоке или программном модуле, частью которого является данный раздел объявлений.
Директива ЯОРРКЕЯЯ не приводит к явному возбуждению исключительных ситуаций. Несмотря на то что этого н не требуется. большинство компиляторов языка Ада реализуют директиву ркаува БОРРКЕЯЯ. Примеры проверок, которые могут быть заблокированы с помощью указания компилятору, приведены ниже. В программах на языке Ада обычно выполняются проверки 1ИОЕХ СНЕСК и КАНОЕ СНЕСК.
Имя 1ИОЕХ СНЕСК относится к проверке выхода индекса массива за пределы допустимого диапазона. Имя РАИСЕ СНЕСК относится к проверке таких условий, как диапазон значения, которое должно быть присвоено переменной, относящейся к подтипу. Если условия, предусмотренные проверками 1ИОЕХ СНЕСК и ВАИБЕ СНЕСК, не выполняются, возбуждается исключительная ситуация СОИЯТВА1ИТ ЕККОК. Проверки О1Ч1Я1ОИ СНЕСК и ОЧЕКГ1ОИ СНЕСК вЂ” зто подавляемые проверки, связанные с проверкой ИОЙЕК1С ЕККОК. Приведенная ниже директива рва9аа блокирует проверку выхода индекса массива за пределы допустимого диапазона: ркайьаа ЯОРРКЕЯЯ(1ИЭЕХ СНЕСК); Существует опция директивы БОРРВБЯЯ, позволяющая указанной исключительной ситуации в дальнейшем ограничиваться только конкретными объектами, типами, подтипами и программными модулями. 13.3.
Обработка исключительных ситуаций в языке Ада 33.3.$. Примвр Следующий пример имеет то же предназначение и использует те же обработки исключительных ситуаций, что и программа на РЬ/), приведенная ранее в втой главе. Этот код определяет распределение входных оценок с помощью массивов счетчиков дяя десяти категорий оценок. Недопустимые оценки распознается с помощью проверки неверных индексов, используемой при увеличении выбранного счетчика.
и?ЕЬ ТЕХТ 10; чае ТЕХТ |О; ркооеоцкв 6РАОЕ 01ЯТК1ВОТ10И Еа рао)саде 1ИТЕ6ЕК ТЕХТ 10 Еа пеи 1ИТЕ6ЕК 10(1ИТЕ6ЕК)г иае 1ХТЕ6ЕК ТЕХТ 10г ГВЕНА: акену (1..10] оК Епквйек := (оЕЬвка => 0)г ХЕХ 6ВАОЕ) 1ИОЕХ, ЫМ1Т 1, ЫМ1Т 2 : 1ИТЕ6ЕК) Ье(таю 1оор 6ЕТ(МЕХ 6КАОЕ)г 1ХОЕХ г= МЕХ 6РАОЕ / 10 + 1; Ьвд?п — блок обработчика исключительной ситуации СОИЯТКА|ИТ ЕККОК ГКЕ(](1ХОЕХ) := ГКЕО(1БОЕХ) + 1г виоерсаоп ицвп СОХЯТКА1НТ ЕККОК => з.к МЕХ 6ВАОЕ = 100 с)теп ГКЕО(10) : ГКЕ(](10) + 1' в1ае РОТ["Ошибка — новая оценка: ")г РОТ(МЕХ 6РАОЕ); РОТ("выходит за пределы допустимого диапазона"] МЕХ ЫИЕг а ?Е) впс(г — конец блока обработчика исключительной — ситуации СОИЯТКА1ХТ ЕКВОК впс( 1оорг вксере?оп — Этот обработчик содержит все окончательные вычисления ицеп ЕБО ОГ Г1ЬЕ => РОТ("Границы Частоты: ")г ХЕХ ЫХЕ) МЕХ ЫХЕ) Тот 1ИОЕХ хп 0..9 1оор ЫМ1Т 1 : 10 * 1ИОЕХг ЫМ1Т 2 : ЫМ1Т 1 + 9) Ей 1ХОЕХ = 9 ЕЬеп ЫМ1Т 2 : 100г епг( 1Е; РОТ(ЫМ1Т 1); РОТ(ЫМ1Т 2) г РОт(ГВЯО(1МОех+1))г МЕХ Ь1ХЕ; епс( |оор; — Тот 1ХОЕХ |п 0..9 епг? 6КАОЕ О|ЯТК|ВОТ|ОХ; 362 Глава 13.
Обработка исключительных ситуаций Заметим, что код для обработки неверных входных оценок находится в своем собственном локальном блоке. Это позволяет программе прололжить выполнение после обработки такой исключительной ситуации, как в предыдущем примере. в котором программа считывала числа с клавиатуры. 13.3.6. Оценка Как и в некоторых других языках, обработка исключительных ситуаций в языке Лг)а представляет собой некий консенсус представлений об этом предмете. по крайней мере он был им во время разработки языка (в конце 1970-х и начале ! 980-х голов).
Очевидно. что эта обработка имеет преимушество над обработкой исключительных ситуаций в языке Р(./1. Некоторое время язык Ада был единственным широко распространенным языком, включавшим обработку исключительных ситуаций. Ситуация изменилась с появлением обработки исключительных ситуаций в языках С++ и )ача. 13.4. Обработка исключительных ситуаций в языке С++ Обработка исключительных ситуаций в языке С++ была одобрена комитетом по стандартизации АМ$1 С++ в 1990 году и затем была реализована в языке С.н-. Ее разработка частично основывалась на обработке исключительных ситуаций в языках С1Л3, Аба и М(..
13.4.1. Обработчики исключительных ситуаций В разделе 13.3 показано, что язык Ада использует программные модули или блоки зля указания области видимости обработчиков исключительных ситуаций. Язык С~ зля этой цели использует специальную конструкцию. которая начинается зарезервированным словом ску. Конструкция ску содержит составной оператор, называемый оператороч ску. и список обработчиков исключительных ситуаций. Составной оператор определяет область видимости последуюших обработчиков. Обший вид этой конструкции таков: ску ( // * Код, который может возбуждать исключительную ситуацию ! оасогг(формальный параметр) ( //* Тело обработчика ) оасоЬ(формальный параметр) ( //* Тело обработчика ) Каждая функция овсе)з представляет собой обработчик исключительной ситуации.
Функция оасо)з может иметь только один формальный параметр, подобный формальному параметру в определении функции в языке С++, включая возможность указания в качестве формального параметра эллипсиса (...). Формальный параметр может быть просто спецификатором типа, например, к1оас, как в прототипе функции. Когда информация об исключительной ситуации передается в обработчик, параметр содержит тнп и имя переменной, используемой лля этой цели.
Например, пользователь может определить в 563 13.4. Обработка исключительных ситуаций в языке С++ качестве исключительной ситуации некий класс и включить в него столько данных- членов, сколько необходимо. В противном случае формальный параметр является просто типом, и его предназначение заключается в однозначной идентификации обработчика. Обработчик с эллипснсом в качестве формального параметра является универсальным (са!сй-аП Ьапд1ег); он алтивизируется при любых исключительных ситуациях, если ранее не был выбран другой обработчик.
Процесс, с помощью которого исключительные ситуации связываются с обработчиками. обсуждается в разделе 13.4.2. В языке С++ обработчики исключительных ситуаций могут содержать любой код на этом языке. 13.4.2. Связывание исключительных ситуаций с обработчиками Исключительные ситуации в языке С++ возбуждаются только явным оператором гззгон, имеющим слелуюший общий вид; ГЬгон[выражение) Квадратные скобки являются метасимволами, используемыми лля того, чтобы указать на необязательность выражения. Оператор сзлгсн без операнда может появляться только в обработчике.
При этом он повторно возбуждает исключительную ситуацию. которая затем обрабатывается где-нибуль в другом месте. Это в точности повторяет использование оператора гаазе а языке Ада без указания имени исключительной ситуации. Ключевое слово гЬгон было выбрано потому, что слова аддпа1 и гадве являются именами функций в стандартной библиотеке функций АМС! С. По типу выражения Ютсн выбирается конкретный обработчик, который, конечно, должен иметь "соответствующий" тип формального параметра. В этом случае слово "соответствующий" означает следующее: обработчик с формальным параметром типа Т, сопя с Т, Т Ь (ссылка на объект типа Т) или сопле Та соответствует оператору ФЬгсн с выражением, имеющим тип Т.