Н. Джехани - Язык Ада (1988) (1160771), страница 107
Текст из файла (страница 107)
ключения, то выполнение этой последовательности операторов прекращается. Последующие действия (включая возможное распространение) зависят от природы окружения и выполняют. ся в соответствии с пп. а) — г). Пример: Вимеси РАСТОВ(А1. (М: РОВ1Т1ЧЕ) меси РЬОАТ Ь Ьсв(и я м = 1 вши гсьис 1.0; свм ви РЬОАТ(М) РАСТОЯ(АММ-1Л ши1 Н; 63мсвз)си свми МОМЕЯ(С Еййой > зеаии Н.ОАТ'ЗАРЕ (АВОЕ1 сия РАСТОВ1АЫ Если при умножении возбуждается исключение МОМЕЙ1С ЕЙЙОЙ, то значение ЕЕОАТ'ЗАРЕ (.АЙВЕ возвращается обработчиком исключения.
Это значение будет вызывать возбуждение исключения МОМЕЙ1С ЕЙЙОЙ при вычислении выражения в каждом из оставшихся обращений к этой функции. Таким образом, для больших значений М эта функция всегда будет возвращать значение ЕЕОАТ'ЗАРЕ (АЙЭЕ. Пример: Ргсссйие Р )с Еяяой: ссссвеси; Ризссвшс й: 42В Глава 11 — ошибочная ситуация 2 ехееяяеп теаеп ЕЙЙОЙ => — Обработчик Е2 Р ее елш Ье91п — ошибочная ситуация 3 Ьеа1п -- ошибочная ситуация 1 О; пяеп ЕЙЙОЙ => — Обработчик Е1 шпэ Р; Могут возникнуть следующие случаи: 1.
Если исключение ЕййОЙ возбуждено при выполнении последовательности операторов внешней процедуры Р, то выполнение процедуры Р заканчивает обработчик Е1, расположенный внутри Р. 2. Если исключение ЕЙЙОй возбуждено при выполнении последовательности операторов процедуры О, то обработчик Е2, расположенныи внутри О, закончит ее выполнение. По окончании выполнения этого обработчика управление Судет возвращено в точку вызова процедуры О.
3. Если исключение ЕЙЙОЙ возбуждено в тепе процедуры й, вызываемой из процедуры О, то выполнение процедуры й прекращается и то же самое исключение возбуждается в теле О. Затем обработчик Е2 заканчивает выполнение процедуры О, как и в случае 2. Заметим, что в случае 3 возбуждение исключения в й приводит (косвенно) к передаче управления обработчику, являющемуся частью О и, следовательно, не вложенному в й.
Заме. тим также, что если бы внутри й был задан обработчик с выбором оэйегв, то в случае 3 вместо непосредственного завершения й выполнился бы этот обработчик. Наконец, если бы исключение ЕЙЙОЙ было описано в й, а не в Р, то обработчики Е1 и Е2 не могли бы обеспечивать обработку исключения ЕЙЙОЙ, так как этот идентификатор не был бы видимым внутри твл Р и О.
В случае 3, однако, это исключение могло бы быть обработано в О с помощью обработчика с выбором исключения о1йега Примечание. В языке не определено, что происходит после прекращения выполнения главной программы в результате необработанного исключения. Предопределенные исключения — это исключения, которые могут распространяться ба. зовыми и предопределенными операциями. Случай, когда окружением является настраиваемый модуль, уже был учтен в правилах для тел подпрограмм и пакетов, так как последовательность операторов такого окружения не выполняется, а служит шаблоном для конкретизации настройки соответствующей последо.
вательности операторов подпрограммы или пакета. Ссылки: базовая операция типа 3.3.3, библиотечный модуль 10.1, вызов подпрограммы 6.4, выполнение 9.4, главная программа 10.1, зависимая задача 9.4, задача 9, исключение 11, исключение М1)МЕЙ1С ЕЙЙОЙ 11.1, конкбетиэвция настроики 12.3, настраиваемыи модуль 12, обра. ботчик исключения 11.2, окружение 11.1, оператор 5, оператор блока 5.6, оператор принятия 9.5, пакет 7, подпрограмма 6, последовательность операторов 5.1, предвыполнение 3,1, 3.9, предопределенная операция 4.5, процедура 6.1, раздел описаний 3.9, след тела 10.2, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, элемент описания 3.9.
11.4.2. ИСКЛЮЧЕНИЯ, ВОЗБУЖДАЕМЫЕ ПРИ ПРЕДВЫПОЛНЕНИИ ОПИСАНИЙ Если исключение возбуждено при предвыполнении раздела описаний данного окружения, то это предвыпопнение прекращается. Дальнейшее действие зависит от природы окружения. а) Для тела подпрограммы — то же исключение повторно возбумсдается в точке вызова подпрограммы, кроме случая, когда эта подпрограмма является главной программой, — тогда ее выполнение прекращается. Исключения б) Для оператора блока — то же исключение повторно возбуждается непосредственно после оператора блока в) Для тела пакета, являющегося дополнительным элементом описания, — то же исключение повторно возбуждается непосредственно после этого элемента описания в объемлющем разделе описании. Если тело пакета является субмодулем, то исключение повторно возбуждается на месте соответствующего следа тела Если пакет является библиотечным модулем, то выполнение главной программы прекращается.
г) Для тела задачи — задача становится законченной, а в точке активизации задачи воэ буждается исключение ТАЗК(МЗ ЕННОН; как пояснено в равд. 9.3. Если исключение возбуждается во время предвыполнения либо описания пакета, либо описания задачи, то это предвыполнение прекращается; дальнейшее действие зависит от природы описания. д) Для описания пакета или задачи, являющегося элементом описания, — то же исключение повторно возбуждается непосредственно после этого элемента описания в объемлющем разделе описаний или в спецификации пакета. Для описания библиотечного пакета — выло.
лнение главнои программы прекращается. Говорят, что повторно возбуждаемое исключение (как рассмотрено выше в пп. а) — г)) распространено либо выполнением подпрограммы или оператора блока, либо предвыполнением описания пакета, описания задачи или тела пакета. Пример исключения е разделе описания оператора блока (случай б)): ргссвдвге Р 1е ышм аесшге М: 1МТЕОЕН Ьер1в — функция Р может возбуждат~ исключение ЕЙНОЙ вхсвраее вйев ЕНЙОН => — обработчик Е1 веря вхсврсмв вйев ЕЙНОЙ => епд Р; — обработчик Е2 -- если исключение ЕННОН возбуждено в описании М, то оно обрабатывается обра- — ботчиком Е2 113.
ИСКЛЮЧЕНИЯ, ВОЗБУЖДАЕМЫЕ ~РИ ВЗАИМОДЕЙСТВИИ ЗАДАЧ Исключение может распространяться на взаимодействие задач или на попытку начать взаимодействие одной задачи с другой. Исключение может также распространяться на вызывающую задачу, если оно было возбуждено в процессе рандеву. Когда задача вызывает вход другой задачи, то в точке этого вызова в вызывающей задаче возбуждается исключение ТАЗК(МЗ ЕННОН, если вызванная задача закончена до принятия вызова входа или к времени этого вызова. Рандеву может иметь аварийное окончание в двух случаях: а) если исключение возбуждено в операторе принятия и не обработано во внутреннем окружении. В этом случае выполнение оператора принятия прекращается, и тоже исключение повторно возбуждается непосредственно после оператора принятия в вызванной задаче; исключение также распространяется на вызывающую задачу в точку вьшова входа, б) если задача, содержащая оператор принятия, закончена аварийно в результате выполнения оператора прекращения.
В этом случае исключение ТАЗК)МО ЕННОН возбуждается в вызывающей задаче в точке вызова входа Ссылки: активизация задачи 9.3, библиотечный модуль 10.1, вызов подпрограммы 6.4, главная программа 10.1, задача 9, законченная задача 9.4, искрю~ение 11, исключение ТАЗК(МЗ ЕННОН 11.1, окружение 11.2, оператор блока 5.6, описание задачи 9.1, описание паке.
та 7.1, подпрограмма 6, предвыполнение 3.1, 3.9, раздел описаний 3.9, след тела 10.2, спецификация пакета 7.1, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, элемент описания 3.9. Глава М С другой стороны, если задача, вызывающая вход, аварийно прекращает свое выполнение (в результате выполнения оператора прекращения), то в вызванной задаче исключение не воз. буждается. Если рандеву еще не началось, то вызов входа аннулируется. Если же рандеву началось, то оно заканчивается нормально, и зто никак не влияет на вызванную задачу. Ссылки: аварийная задача 9.10, вызов входа 9.5, задача 9, законченная задача 9.4, исклю.
чение 11, исключение ТАЗК(НО ЕЙЙОЙ 11.1, окружение 11.2, оператор прекращения 9.10, опе. ратор принятия 9.5, рандеву 9.5. 11.9. ИСКЛЮЦЕНИЯ И ОПТИМИЗАЦИЯ В данном разделе описаны условия, при которых в реализации можно выполнять те или иные действия раньше или позже, чем это определено правилами языка. В целом, если правила языка задают порядок некоторых действий (каноническнй поря. док), реализация может иопольэовать альтернативный порядок при гарантии, что такое переупорядочивание не скажется на результате выполнения программы. В частности, если при выполнении программы в каноническом порядке не возбуждается никакое исключение, то также никакие исключения не должны возбуждаться при выполнении переупорядоченной программы.
С другой стороны, если порядок некоторых действий не определен языком, то реализация может использовать любой порядок. (Например, аргументы предопределенной операции могут вычисляться в любом порядке, так как правила из равд. 4.5 не требуют опреде. ленного порядка выполнения.) Реализации предоставляется дополнительная свобода для переупорядочивания действий, включающих предопределенные или базовые операции, за исключением присваивания. Эта свобода предоставляется даже в том случае, если при выполнении предопределенных операций может распространяться (предопределенное) исключение с учетом следующих правил: а) С целью установления, одинаков ли результат выполнения некоторых действий в кано.
ническом или альтернативном порядке, можно предположить, что ни одна из вызванных этими действиями предопределенных операций не распространяет (предопределенные) исключе. ния, и при этом выполняются два следующих требования к реализации альтернативного по. рядка: во.первых, операция не должна вызываться в альтернативном порядке, если она не вызывается в каноническом порядке; вочзторых, самое внутреннее объемлющее окружение или оператор принятия для каждой операции должны быть одинаковы для канонического и альтернативного порядков с теми же самыми обработчиками исключений. б) Связь знака операций с операндами в выражении определена синтаксисом. Однако для последовательности предопределенных операций с одним и тем же приоритетом (при отсутствии скобок, вводящих особые связи) зти связи могут быть изменены (и это допускается) при выполнении следующего требования: результат целого типа должен быть эквивалентен результату вычислений в каноническом порядке слева направо; результат вещественного типа должен принадлежать модельному интервалу результата, полученного после выполнения в каноническом порядке слева направо (см.