Н. Джехани - Язык Ада (1988) (1160771), страница 40
Текст из файла (страница 40)
Например, в приведенной выше программе невозможно определить, какая из операций чтения возбудила исключение, т. е. были ли это ошибочные файлы или произошел сбой устройства. Эту задачу можно решить, модифицируя МЕКОЕ БОКТ следующим образом: 1. Поместить операции КЕАР в процедуру, скажем, СЬЕАК КЕАР, которая выполняет свою собственную обработку исключения. Процедура С1.ЕАК вЂ” КЕАР следующая: ргосе<1пге СЬЕАК КЕАР(Р: 1п 1Х Г1ЬЕ; Ч: оп( БТЫРЕХТ РАТА) )в Ьей1п КЕАР(Р, Ч); ехсерг(оп чгЬеп ЕХР ЕККОК > ТЕХТ 1О.Р()Т(«ОШИБКА: файл» й МАМИИ й «пуст») пЬеп РЕЧ1СЕ ЕККОК > ТЕХТ 1О.Р1)Т («ОШИБКА: устройство» й ХАМЕ(Р) й «не работает») гагм; чгЬеп РАТА ЕККОК > ТЕХТ 10.Р13Т («ОШИБКА: файл» й ХАМЕ(Р) й«содержит неверные данные»)„' гагае; епЬ СЬЕАК КЕАР; Гвввв 5 Исключения в С1.ЕАК КЕМ обрабатываются самой процедурой СЬЕАК КЕАО.
Так как имя файла включено в операцию чтения, то нетрудно идентифицировать файл (или содержащее его устройство), который вызовет возбуждение исключения. СЬЕАК КЕА[) возбуждает исключение для МЕКОЕ ЯОКТ, которая "затем должна закрыть все файлы. 2. Заменить все вызовы КЕАО на вызовы процедуры СЬЕАК КЕА[Э. 3. Изменить обработчик исключений в МЕКОЕ БОКТ таким образом, чтобы он содержал только следующий обработчик исключения: запел ЕХ0 ЕККОК ~ 1)ЕЧ1СЕ ЕККОК ~ РАТА ЕККОК > СЬОЗЕ(Р); СЬОБЕ(О); СЬОБЕ(К); Этот пример показывает также подходящее использование оператора выхода. Программу можно написать и без него'з, используя одну из следующих альтернатив: 1. Использовать цикл зи[з[!е с дополнительной логической переменной.
2. Разрешить операторам КЕА1) в цикле возбуждать исключение Е[х[1) ЕККОК н выполнить всю заключительную обработку (копирование одного из непустых входных файлов в выходной и закрытие файлов) в соответствующем обработчике исключения. Это будет, конечно, требовать явных проверок для пустых входных файлов. Данное решение заставляет перенести некоторые регулярные вычисления, т. е завершающую обработку при достижении конца одного из входных файлов, в обработчик исключения.
Использование обработчиков исключения для выполнения заключительной обработки в программе не является хорошим стилем программирования, так как обработчик исключения предназначается только для обработки исключительных ситуаций. Элегантное и краткое решение, не требующее использования операторов выхода, можно заимствовать из паскалеподобных языков [1Е[х[74), в которых имеется возможность заглядывать на один элемент вперед для всех входных файлов". оййе либо файл Р, либо файл () непустой 1оор Р и Π— переменные, связанные с файлами Р и О, просматривающие файлы на элемент вперед.
Множество Н образует файл из подходящих (правильных) элементов Р и О только после того, как осуществляется проверка переменной. Записать Н в выходной файл К еле[ 1оор; Скопировать остаток непустого файла (лнбо Р, либо О) в выходной файл К "Поскольку оператор выхода является ограниченной формой оператора перехода, программист должен объяснять каждое использование оператора выхола. и Эта стратегия заглялываиия вперел вызывает проблемы при интерактивном ввода [ГЕ[[82!. Исключения 5.9.6.
Пример, иллюаприрующий «последнее желание» подпрограммы [1.)ОО79б1 Предположим, что во время выполнения подпрограммы может появиться несколько исключений, которые не обрабатываются локально, а распространяются на вызывающую подпрограмму. Прежде чем завершиться, подпрограмма должна иметь возможность выполнить свои «последние желания», такие как чистка или устранение нежелательных эффектов, вызванных ее частичным выполнением. Возможность выполнения «последнего желания» может быть дана подпрограмме путем включения в нее обработчика исключений с альтернативой огйегв. Обработчик, который будет содержать «последнее желание» подпрограммы, располагаегся после оператора возбуждения для распространения исключения на вызывающую подпрограмму.
Предположим, что настраиваемый пакет О!ВЕСТ 1О соответствующим образом конкретизирован и его понятия непосредственно видимы за счет использования спецификатора цве. Теперь рассмотрим в качестве примера подпрограмму НЬЕ РйОСЕББ, которая используется для того, чтобы некоторым образом обработать файл: ргосейже Н1.Е РКОСЕББ(Г1ЬЕ ХАМЕ: БТК1ХО) 1в Г: Н1.Е ТУРЕ; Ьей(п Инициализирующие действия ОРЕХ(Г, 1ХОЫТ Н1.Е, Г1ЬЕ ХАМЕ); Обработка файла С1.ОБЕ(Г); Заключительные действия еп4 Г11.Е РКОСЕББ; Исключение, появившееся во время обработки файла, будет причиной того, что файл останется открытым, так как выполнение операции НЬЕ РКОСЕББ будет немедленно прекращено и исключение будет распространено на процедуру, вызвавшую НЬЕ РКОСЕББ. Перед завершением работы НЬЕ РКОСЕББ в качестве своего «последнего желания» хотела бы закрыть входной файл.
Выполнение «последнего желания» можно обеспечить, если описать обработку файла как подпрограмму БАГЕ НЬЕ РКОСЕББ: ргосейне БАГЕ НЬЕ РКОСЕББ(Г1ЬЕ ХАМЕ: БТК1ХО) 1в Г: Г11.Е ТУРЕ; Ье)рв Начальные действия ОРЕХ(Г, 1ХО()Т НЬЕ, Н1.Е ХАМЕ); Ьефв Обработка файла ехсерйоп нЬеп огЬегв > СЬОБЕ(Г); га)ве; Глава в епп; СЬОБЕ(Р); Заключительные действия епй БАРЕ НЬЕ РКОСЕББ; Все исключения, которые возникают во время выполнения БАРЕ Р1ЬЕ РКОСЕББ, распространяются на вызывающую подпрограмму. Исключения, которые появляются во время обработки файла, прежде всего обрабатываются локально.
Локальный обработчик исключений закрывает файл и повторно возбуждает исключение, которое передается вызывающей подпрограмме. 5.9.7. Пример синтаксического анализа При синтаксическом анализе часто возникают ситуации, когда из-за большого числа ошибок в обрабатываемой программе дальнейшее распознавание становится невозможным.
В зтом случае программа прекращает дальнейший анализ входной программы. Скелет процедуры РАКБЕ, выполняющей синтаксический анализ, показывает, что исключение САХХОТ КЕСОУЕК возбуждается, когда нет смысла для дальнейшей обработки. Обработчик исключения для САХХОТ КЕСОУЕК закрывает файлы и печатает соответствующие сообщения. ргеседпге РАКБЕ!в САХХОТ КЕСОЧЕК: ехеербоп; 1Т Ошибка Еяеп И Восстановление возможно Спев Исправить ошибки наиболее приемлемым способом еЬе и восстановить выполнение гаме САХХОТ КЕСОЧЕК; епй 1г; епв!Г; ехсербоп ийеп САХХОТ КЕСОЧЕК ) Печать сообщения, указывающего, где распознавание прекрашено; закрытие файлов,...
епв РАКБЕ; Глава б Настраиваемые модули ~121 6.1. Введение Подпрограммы и пакеты в языке Ада могут быть настраиваемыми, т. е. они являются шаблонами, по которым создаются обыкновенные подпрограммы и пакеты. Настраиваемые подпрограммы и пакеты могут иметь в качестве параметров в дополнение к обычным типы и подпрограммы. Настраиваемые подпрограммы и пакеты являются четвертым видом программных модулей, из которых строятся программы.
Другие три — это подпрограммы, пакеты и задачи. Настраиваемые подпрограммы и пакеты имеют две части — специЯикацию настройки и тело. Они специфицируются посредством описания настройки. Описание настройки представляет собой настраиваемую часть, в который описываются формальные параметры настройки. За ними следует специ4икация программы или пакета. Тело настраиваемой подпрограммы или пакета имеет ту же форму, что и тело обыкновенной подпрограммы или пакета.
Настраиваемые подпрограммы и пакеты нельзя использовать непосредственно, так как они являются шаблонами, по которым создаются требуемые подпрограммы и пакеты. Настраиваемые подпрограмма или пакет прежде всего должны быть конкретизированы (посредством описания) для некоторого набора настраиваемых фактических параметров.
Эта конкретизация создает новую подпрограмму или пакет, которые затем можно использовать аналогично любой другой подпрограмме или пакету. Конкретизаций можно создать сколь угодно много. Настраиваемые подпрограммы и пакеты упрощают некоторые утомительные аспекты программирования. Предположим, что нам приходится сортировать несколько массивов, каждый из которых содержит элементы различных типов, например, действительного, перечислимого, целого и символьного типов.
Без настраиваемых модулей процедуру сортировки пришлось бы писать для каждого типа элементов. При использовании настраиваемых модулей можно написать одну процедуру для сортировки всех массивов, независимо от типов их элементов. Настраиваемая процедура сортировки будет иметь тип элементов массива, индексируемый тип и операцию сравнения «(» (определенную для типа элементов массива) в качестве формальных параметров. Эту настраиваемую процедуру можно конкретизировать для любого типа элементов, для которого определена операция сравнения «<». Преимущества использования настраиваемых модулей в языке программирования заключаются в следующем 1ОЕН80, ОК1771: 1. Уменьшаются затраты на программирования Только одну настраиваемую подпрограмму или пакет необходимо написать в случае идентичных подпрограмм или пакетов, отличающихся типами формальных параметров, связанными с ними локальными переменными и используемыми в них подпрограммами.