Справочное руководство по языку Ада-83

         

Исключения


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

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

Ссылки: имя 4.1, обработчик исключения 11.2, оператор блока 5.6, оператор возбуждения 11.3, ошибочная ситуация 1.6, распространение исключения 1, 2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы



Исключения и оптимизация


В данном разделе описаны условия, при которых в реализации можно выполнять те или иные действия раньше или позже, чем это определено правилами языка.

В целом, если правила языка задают порядок некоторых действий [канонический порядок},

реализация может использовать альтернативный порядок при гарантии, что такое переупорядочивание не скажется на результате выполнения программы. В частности, если при выполнении программы в каноническом порядке не возбуждается никакое исключение, то также никакие исключения не должны возбуждаться при выполнении переупорядоченной программы. С другой стороны, если порядок некоторых действий не определен языком, то реализация может использовать любой порядок. (Например, аргументы предопределенной операции могут вычисляться в любом порядке, так как правила из разд. 4.5 не требуют определенного порядка выполнения.)

Реализации предоставляется дополнительная свобода для переупорядочивания действий, включающих предопределенные или базовые операции, за исключением присваивания. Эта свобода предоставляется даже в том случае, если при выполнении предопределенных операций может распространяться (предопределенное) исключение^ с учетом следующих правил:

а) С целью установления, одинаков ли результат выполнения некоторых действий в каноническом или альтернативном порядке, можно предположить, что ни одна из вызванных этими действиями предопределенных операций не распространяет (предопределенные) исключения, и при этом выполняются два следующих требования к реализации альтернативного порядка: во-первых, операция не должна вызываться в альтернативном порядке, если она не вызывается в каноническом порядке; во-вторых, самое внутреннее объемлющее окружение или оператор принятия для каждой операции должны быть одинаковы для канонического и альтернативного порядков с теми же самыми обработчиками исключений.

б) Связь знака операций с операндами в выражении определена синтаксисом. Однако для последовательности предопределенных операций с одним и тем же приоритетом (при отсутствии скобок, вводящих особые связи) эти связи могут быть изменены (и это допускается) при выполнении следующего требования: результат целого типа должен быть эквивалентен результату вычислений в каноническом порядке слева направо; результат вещественного типа должен принадлежать модельному интервалу результата, полученного после выполнения в каноническом порядке слева направо (см. 7). Такое переупорядочивание допустимо даже тогда, когда может быть устранено некоторое исключение или вставлено предопределенное исключение.

Также дополнительная свобода предоставляется реализации при вычислении простых числовых выражений. При выполнении предопределенных операций в реализации допускается использование операций над типами, которые имеют более широкий диапазон результата, чем базовый тип операндов, при условии, что это приводит к точному результату (или результату с заданной точностью для вещественного типа), даже если промежуточные результаты выходят за границы базового типа. В таком случае нет необходимости возбуждать исключение NUMERIC_ERROR. В частности, если числовое выражение является операндом предопределенной операции отношения и может быть получен правильный результат типа BOOLEAN, то в процессе вычисления можно не возбуждать исключение NUMERIC_ERROR.

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

Примечание. Правило б) применимо к предопределенным операциям, но неприменимо к формам управления с промежуточной проверкой.

Выражение SPEED < 300-000.0 может быть заменено на TRUE, если значение 300-000.0 находится вне границ базового типа для SPEED, даже если неявное преобразование этого числового литерала может возбудить исключение NUMERIC_ERROR.

Пример:

declare N : INTEGER; begin N := О; -- (1) for J in 1 .. 10 loop N := N + J**A(K); -— А и К являются глобальными переменными end loop; PUT(N); exception when others => PUT("Some error arose"); PUT(N); end:

Вычисление А(К) может быть выполнено до цикла и, возможно, непосредственно перед оператором присваивания (1), даже если в нем может возбуждаться исключение. Следовательно, внутри обработчика исключения значение N будет либо неопределенным, либо результатом последнего присваивания. С другой стороны, вычисление А(К) не может быть выполнено до begin, поскольку в этом случае исключение будет обрабатываться другим обработчиком. По этой причине инициализация N в описании будет исключать возможность наличия неопределенного начального значения N в обработчике.

Ссылки: базовая операция типа 3, базовый тип 3.3, вещественный тип 6, исключение 11, исключение NUMERIC_ERROR 11.1, неопределенное значение 1, обработчик исключения 11.2, окружение 11.1, оператор принятия 9.5, ошибочная ситуация 11, присваивание 5.2, предопределенная операция 4.5, предопределенная подпрограмма 8.6, преобразование 4.6, распространение исключения 11.4, точность вещественных операций типа 7.



Исключения, возбуждаемые при взаимодействии задач


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

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

Рандеву может иметь аварийное окончание в двух случаях:

а) если исключение возбуждено в операторе принятия и не обработано во внутреннем окружении. В этом случае выполнение оператора принятия прекращается, и то же исключение повторно возбуждается непосредственно после оператора принятия в вызванной задаче; исключение также распространяется на вызывающую задачу в точку вызова входа,

б) если задача, содержащая оператор принятия, закончена аварийно в результате выполнения оператора прекращения. В этом случае исключение TASKING - ERROR возбуждается в вызывающей задаче в точке вызова входа.

С другой стороны, если задача, вызывающая вход, аварийно прекращает свое выполнение (в результате выполнения оператора прекращения), то в вызванной задаче исключение не возбуждается. Если рандеву еще не началось, то вызов входа аннулируется. Если же рандеву началось, то оно заканчивается нормально, и это никак не влияет на вызванную задачу.

Ссылки: аварийная задача 9.10, вызов входа 9.5, задача 9, законченная задача 9.4, исключение 11, исключение TASKING_ERROR 11.1, окружение 11.2, оператор прекращения 9.10, оператор принятия 9.5, рандеву



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


Ответная реакция на одно или несколько исключений определяется обработчиком исключения.

обработчик - исключения :: = when выбор-исключения { | выбор-исключения) => последовательность-оператороввыбор-исключения ::= имя-исключения | others

Обработчик исключения помещается в оператор блока, в тело подпрограммы, пакет, за-дачный модуль или настраиваемый модуль. Каждая из указанных в этой главе конструкцийназывается окружением. В любом случае окружение обработчиков исключений синтаксически включает следующий раздел:

begin последовательность - операторов exception обработчик - исключения {обработчик-исключения} end

Имена исключений, перечисленные во всех выборах данного окружения, должны быть все различны. Выбор исключения others допустим только в последнем обработчике исключения данного окружения как единственный выбор; он задает все исключения, не перечисленные в предыдущих обработчиках окружения, включая исключения, имена которых на месте данного обработчика исключения невидимы.

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

Пример:

begin -- последовательность операторов exception when SINGULAR | NUMERIC.ERROR => PUT(" MATRIX IS SINGULAR "); when others => PUT(" FATAL ERROR "); raise ERROR; end;

Примечание. В каждом обработчике исключений и в последовательностях операторов окружения допустимы одни и те же виды операторов. Например, оператор возврата допустим в обработчике, если окружение является телом функции.

Ссылки: видимость 8.3, имя 4.1, исключение 11, настраиваемое тело 12.2, настраиваемый модуль 12.1, обработка исключения 11.4, оператор блока 5.6, оператор возбуждения 11.3, оператор возврата 5.8, последовательность операторов 5.1, раздел описаний 3.9, тело задачи 9.1, тело модуля 9, 9.1, тело пакета 7.1, тело подпрограммы 6.3, тело функции



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


После возбуждения исключения нормальное выполнение программы прекращается и управление, передается обработчику исключения. Выбор обработчика зависит от места возбуждения: при выполнении операторов или при предвыполнении описаний.

Ссылки: возбуждение исключения 11.3, исключение 11, обработчик исключения 11.2, оператор 5, описание 3.1, предвыполнение 3.1,

1. ИСКЛЮЧЕНИЯ, ВОЗБУЖДАЕМЫЕ ПРИ ВЫПОЛНЕНИИ ОПЕРАТОРОВ

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

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

Если некоторое исключение возбуждено в последовательности операторов окружения, содержащего нужный обработчик, то выполнение этой последовательности операторов прекращается и управление передается обработчику данного исключения. Выполнение последовательности операторов обработчика заканчивает выполнение окружения (или предвыполнение, если окружение — тело пакета).

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

а) Для тела подпрограммы — то же исключение повторно возбуждается в точке вызова этой подпрограммы, кроме случаев, когда она является главной программой. Тогда выполнение главной программы прекращается.

б) Для оператора блока — то же исключение повторно возбуждается непосредственно после оператора блока (т. е. в самом вложенном объемлющем окружении или в операторе принятия, содержащем этот оператор блока).

в) Для тела пакета, являющегося дополнительным элементом описания, — то же исключение повторно возбуждается непосредственно после этого элемента описания (в объемлющем разделе описаний). Если тело этого пакета описано как субмодуль, то исключение повторно возбуждается на месте соответствующего следа тела. Если пакет является библиотечным модулем, то выполнение главной программы прекращается.

г) Для тела задачи — задача становится законченной.

Говорят, что повторно возбужденное исключение (как это рассмотрено в пп. а), б) и в)) распространяется либо выполнением подпрограммы, либо выполнением оператора блока, либо предвыполнением тела пакета. В случае тела задачи распространения не происходит. Если окружение является подпрограммой или оператором блока и если оно содержит зависимые задачи, то распространение исключения происходит только после завершения зависимых задач.

Наконец, если исключение возбуждено в последовательности операторов обработчика исключения, то выполнение этой последовательности операторов прекращается. Последующие действия (включая возможное распространение) зависят от природы окружения и выполняются в соответствии с пп. а) ~ г).

Пример:

function FACTORIAL (N : POSITIVE) return FLOAT is begin if N = 1 then return 1.0; else return FLOAT(N) * FACTORIAL(N-I); end if; exception when NUMERIC_ERROR => return FLOATSAPE_LARGE; end FACTORIAL;

Если при умножении возбуждается исключение NUMERIC_ERROR, то значение FLOAT'SAFE- LARGE возвращается обработчиком исключения. Это значение будет вызывать возбуждение исключения NUMERIC_ERROR при вычислении выражения в каждом из оставшихся обращений к этой функции. Таким образом, для больших значений N эта функция всегда будет возвращать значение FLOAT'SAFE-LARGE.

Пример:

procedure P is ERROR : exception; procedure R; procedure Q is begin R; ... -— ошибочная ситуация 2 exception ... when ERROR => -— обработчик Е2 end Q; procedure R is begin ... -— ошибочная ситуация З end R;begin ... —- ошибочная ситуация 1 Q; ... exception ... when ERROR => -- обработчик Е1 ... end P;

Могут возникнуть следующие случаи:

1. Если исключение ERROR возбуждено при выполнении последовательности операторов внешней процедуры P, то выполнение процедуры Р заканчивает обработчик Е1, расположенный внутри Р.

2. Если исключение ERROR возбуждено при выполнении последовательности операторов процедуры Q, то обработчик Е2, расположенный внутри Q, закончит ее выполнение. По окончании выполнения этого обработчика управление будет возвращено в точку вызова процедуры Q.

3. Если исключение ERROR возбуждено в теле процедуры R, вызываемой из процедуры Q, то выполнение процедуры R прекращается и то же самое исключение возбуждается в теле Q. Затем обработчик Е2 заканчивает выполнение процедуры Q, как и в случае 2.

Заметим, что в случае 3 возбуждение исключения в R приводит (косвенно) к передаче управления обработчику, являющемуся частью Q и, следовательно, не вложенному в R. Заметим также, что если бы внутри R был задан обработчик с выбором others, то в случае 3 вместо непосредственного завершения R выполнился бы этот обработчик.

Наконец, если бы исключение ERROR было описано в R, а не в Р, то обработчики Е1 и Е2 не могли бы обеспечивать обработку исключения ERROR, так как этот идентификатор не был бы видимым внутри тел Р и Q. В случае 3, однако, это исключение могло бы быть обработано в Q с помощью обработчика с выбором исключения others.

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

Предопределенные исключения — это исключения, которые могут распространяться базовыми и предопределенными операциями.

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

Ссылки: базовая операция типа 3, библиотечный модуль 10.1, вызов подпрограммы 6.4, выполнение 9.4, главная программа 10.1, зависимая задача 9.4, задача 9, исключение 11, исключение NUMERIC_ERROR 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, элемент описания

2. ИСКЛЮЧЕНИЯ, ВОЗБУЖДАЕМЫЕ ПРИ ПРЕДВЫПОЛНЕНИИ ОПИСАНИЙ

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

а) Для тела подпрограммы — то же исключение повторно возбуждается в точке вызова подпрограммы, кроме случая, когда эта подпрограмма является главной программой, — тогда ее выполнение прекращается.

б) Для оператора блока — то же исключение повторно возбуждается непосредственно после оператора блока.

в) Для тела пакета, являющегося дополнительным элементом описания, — то же исключение повторно возбуждается непосредственно после этого элемента описания в объемлющем разделе описаний. Если тело пакета является субмодулем, то исключение повторно возбуждается на месте соответствующего следа тела. Если пакет является библиотечным модулем, то выполнение главной программы прекращается.

г) Для тела задачи — задача становится законченной, а в точке активизации задачи возбуждается исключение TASKING_ERROR; как пояснено в разд.

Если исключение возбуждается во время предвыполнения либо описания пакета, либо описания задачи, то это предвыполнение прекращается; дальнейшее действие зависит от природы описания.

д) Для описания пакета или задачи, являющегося элементом описания, — то же исключение повторно возбуждается непосредственно после этого элемента описания в объемлющем разделе описаний или в спецификации пакета. Для описания библиотечного пакета — выполнение главной программы прекращается.

Говорят, что повторно возбуждаемое исключение (как рассмотрено выше в пп. а) — г)) распространено либо выполнением подпрограммы или оператора блока, либо предвыполнени-ем описания пакета, описания задачи или тела пакета.

Пример исключения в разделе описания оператора блока (случай б}):

procedure P is ... begin declare N: INTEGER := F; -- ФУНКЦИЯ F может возбуждать исключение ERROR begin ... exception when ERROR => -- обработчик Е1 end;exception when ERROR => -- обработчик Е2 end P;-- если исключение ERROR возбуждено в описании N, то -- оно обрабатывается обработчиком Е2

Ссылки: активизация задачи 9.3, библиотечный модуль 10.1, вызов подпрограммы 6.4, главная программа 10.1, задача 9, законченная задача 9.4, исключение 11, исключение TASKING - ERROR 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, элемент описания



Операторы возбуждения


Оператор возбуждения возбуждает исключение.

оператор-возбуждения ::= raise [имя-исключения];

При выполнении оператора возбуждения с именем исключения возбуждается заданное исключение. Оператор возбуждения без имени исключения допустим только внутри обработчика исключения (но не в последовательности операторов подпрограммы, пакета, задачного модуля или настраиваемого модуля, вложенных в данный обработчик); он снова возбуждает то же исключение, которое вызвало переход на обработчик, содержащий данный оператор возбуждения.



Описания исключений


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

описание-исключения ::= список-идентификаторов: exception;

Описание исключения с несколькими идентификаторами эквивалентно последовательности единичных описаний с одним идентификатором (см. 3.2). Каждое единичное описание исключения задает имя отличного от других исключения. В частности, если настраиваемый модуль содержит описание исключения, то такие описания, неявно сгенерированные различными конкретизациями настройки, ссылаются на разные исключения (но все они имеют один и тот же идентификатор). Конкретное исключение, обозначенное именем, определяется во время компиляции и является одним и тем же независимо от числа предвыполнений его описания. Следовательно, если описание исключения находится в рекурсивной подпрограмме, то имя исключения обозначает одно и то же исключение для всех вызовов рекурсивной подпрограммы.

В языке предопределены следующие исключения. Они возбуждаются при обнаружении описанных ниже ситуаций.

CONSTRAINT_ERROR Это исключение возбуждается в любой из следующих ситуаций: при попытке нарушить ограничение диапазона, ограничение индекса или ограничение дискриминанта; при попытке использовать компоненту записи, не существующую для текущих значений дискриминанта; при попытке использовать именуемую компоненту, индексируемую компоненту, отрезок или атрибут объекта, обозначенного ссылочным значением, если этот объект не существует, поскольку ссылочное значениепустое

NUMERIC_ERROR Это исключение возбуждается при выполнении предопределенной числовой операции, которая не может выработать верный результат (для вещественных типов в пределах предписанной точности). Сюда относится также случай использования реализацией предопределенных числовых операций для выполнения, вычисления или предвыполнения некоторой конструкции. Данные в разд. 7 правила определяют случаи, для которых от реализации не требуется возбуждения исключения в случае возникновения ошибочной ситуации (см. также 11.6).
PROGRAM_ERROR Это исключение возбуждается при попытке вызвать подпрограмму, активизировать задачу или предвыполнить конкретизацию настройки, если тело соответствующего модуля еще не предвыполнено. Оно также возбуждается, если выполнение функции завершается через end (см. 6.5), при выполнении оператора отбора с ожиданием, когда отсутствует раздел else, a все альтернативы закрыты (см. 1). Наконец, в зависимости от реализации исключение может возбуждаться при попытке выполнить ошибочное действие и при некорректной зависимости от порядка (см. 1.6).
STORAGE_ERROR Это исключение возбуждается в одной из следующих ситуаций: при вычислении генератора; когда не хватает динамической памяти, выделенной для задачи; когда исчерпана память для набора генерируемых объектов; при предвыполнений элемента описания или при вызове подпрограммы, если памятинедостаточно.
TASKING_ERROR Это исключение возбуждается при возбуждении исключений во время взаимодействия задач (см. 9 и 11.5).

Примечание. Описанные выше ситуации могут возникать, не возбуждая соответствующих исключений, если была использована прагма SUPPRESS подавления проверок (см. 11.7).

Примеры описанных пользователем исключений:

SINGULAR : exception; ERROR : exception; OVERFLOW, UNDERFLOW : exception;

Ссылки: вещественный тип 6, задача 9, идентификатор 2.3, имя 4.1, исключение 11, компонента записи 3.7, конкретизация 12.3, конкретизация настройки 12.3, набор 3.8, настраиваемое тело 12.2, настраиваемый модуль 12, неявное описание 12.3, обработчик исключения 11.2, объект 3.2, оператор возбуждения 11.3, оператор возврата 5.8, описание 3.1, подпрограмма 6, ссылочное значение 3.8, тело задачи 9.1, тело подпрограммы

Контекст исключения CONSTRAINT_ERROR: агрегат 1, 2, атрибут дискретного типа 5, генератор 4.8, именованная компонента 3, индекс входа 9.5, индексированная компонента 1, квалифицированное выражение 4.7, логическая операция 1, ограничение 2, ограничение диапазона 3.5, ограничение дискриминанта 2, ограничение индекса 1, оператор присваивания 5.2, 1, операция возведения в степень 6, описание объекта 1, отрезок 2, преобразование типа 4.6, предвыполнение формального параметра настройки 12.3, пустое ссылочное значение 3.8, сопоставление параметров 1, указание подтипа 2.

Контекст исключения NUMERIC_ERROR: атрибут дискретного типа 5, неявное преобразование 4, 6, 4.6, операция над числовым типом 4.5, 7, числовая операция 5, 8, 10.

Контекст исключения PROGRAM_ERROR: выход из функции 6.5, контроль предвыполнения 3.9, 7.3, 9.3, 12.2, набор 3.8, некорректная зависимость от порядка 1.6, отбор с ожиданием 1, ошибочный 1.6, предвыполнение

Контекст исключения STORAGE_ERROR: генератор

Контекст исключения TASKING_ERROR: активизация задачи 9.3, вызов входа 9.5, 2, 3, исключения при взаимодействии задач 11.5, оператор прекращения 9.10.



Подавление проверок


Присутствие прагмы SUPPRESS позволяет реализации опускать некоторые проверки во время выполнения программы. Эта прагма имеет следующий вид:

pragma SUPPRESS (идентификатор [, [ON =>] имя]);-

Проверка, указанная идентификатором, может быть опущена. Имя (если оно присутствует) должно быть простым или расширенным и обозначать объект, тип или подтип, задачный модуль или настраиваемый модуль; оно также может быть именем подпрограммы, в этом случае имя обозначает все видимые совмещенные подпрограммы.

Прагма SUPPRESS допустима непосредственно в разделе описаний или непосредственно в спецификации пакета. Во втором случае допустимо представление прагмы только с именем, которое обозначает понятие (или несколько совмещенных подпрограмм), описанное непосредственно в спецификации пакета. Действие прагмы распространяется от местоположения прагмы до конца зоны описания, связанной с самым внутренним объемлющим оператором блока или программным модулем. Если прагма задана в спецификации пакета, то ее действие распространяется до конца области действия именованного понятия.

Если в прагму включено имя, то возможность подавления проверки в дальнейшем ограничена: прагма действует только для операций над объектом с этим именем или над всеми объектами базового типа для указанного в прагме имени типа или подтипа, для вызовов подпрограмм с этим именем, для активизации задач указанного именем задачного типа и для конкретизации указанного настраиваемого модуля.

Следующие проверки соответствуют ситуациям, в которых может быть возбуждено исключение CONSTRAINT_ERROR. В этих проверках имя (если оно указано) должно обозначать объект или тип

ACCESS_CHECK Проверяется именуемая компонента, индексируемая компонента, отрезок или атрибут объекта, указанный ссылочным значением на неравенство значению null этого ссылочного значения.
DISCRIMINANT_CHECK Проверяется, что дискриминант составного значения удовлетворяет ограничению дискриминанта. Также при ссылке на компоненты записи проверяется их существование для текущих значений дискриминанта.
INDEX_CHECK Проверяется, что границы значений индексов массива равны соответствующим границам ограничения индекса. Также при ссылке на компоненту массива по каждой размерности проверяется, что данное значение индекса находится в диапазоне, определенном границами индекса массива; при ссылке на отрезок массива проверяется, что заданный дискретный диапазон совместим с диапазоном, определенным границами индексов массива.
LENGTH_CHECK Проверяется, что каждой компоненте массива соответствует подходящая компонента при выполнении присваивания массиву, преобразовании типа и выполнении логических операций над массивами логических компонент.
RANGE_CHECK Проверяется, что некоторое значение удовлетворяет ограничению диапазона. Также при предвыполнении указания подтипа проверяется совместимость ограничения (если оно имеется) с обозначением типа. Для агрегата проверяется принадлежность индекса или дискриминанта соответствующему подтипу. Наконец, осуществляются проверки любых ограничений, создаваемых при конкретизации настройки.

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

DIVISION_CHECK Проверяется, что второй операнд операций /, rem и mod не равен нулю.
OVERFLOW_CHECK Проверяется, что в результате выполнения числовой операции не возникает переполнения.

Следующие проверки соответствуют ситуациям, в которых возбуждается исключение PROGRAM - ERROR. Допустимыми именами в соответствующих прагмах являются имена задач-ных модулей, настраиваемых модулей или подпрограмм.

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

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

STORAGE_ERROR Проверяется, что выполнение генератора не потребует объема памяти, большего, чем необходимо для выбора, или что требуемый под задачу или для подпрограммы объем памяти достаточен.

Если возникает ошибочная ситуация в отсутствие проверок во время выполнения программы, то программа считается ошибочной (результаты выполнения не определяются в языке).



исключение 11, настраиваемый модуль 12,



Примечание

raise SINGULAR; raise NUMERIC_ERROR; -- явно возбуждается предопределенное исключение raise; -— только внутри обработчика исключения Ссылки: задачный модуль 9, имя 4.1, исключение 11, настраиваемый модуль 12, пакет 7, подпрограмма 5.1, последовательность операторов

Для некоторых реализации может оказаться



Примечание

pragma SUPPRESS (RANGE_CHECK);
pragma SUPPRESS (INDEX_CHECK, ON => TABLE);
Примечание. Для некоторых реализации может оказаться невозможным или слишком дорогим подавление некоторых проверок, тогда соответствующая прагма SUPPRESS может быть проигнорирована. Следовательно, наличие такой прагмы внутри данного модуля не гарантирует, что соответствующее исключение не будет возбуждено; эти исключения также могут распространяться вызванными модулями.
;i Ссылки: агрегат 4.3, активизация 9.3, атрибут 4, вызов подпрограмм????? |4.8, дискретный диапазон 3.6, дискриминант 1, задача 9, задачный модуль 9, задачный тип 1'9.1, идентификатор 2.3, именуемый тип 3.7, индекс 3.6, индексируемая компонента 1, исключение CONSTRAINT_ERROR 11.1, исключение NUMERIC_ERROR 11.1, исключение PROGRAM_ERROR 11.1, компонента записи 3.7, компонента массива 3.6, конкретизация наст-ройки 12.3, массив 3.6, набор 3.8, настраиваемое тело 11.1, настраиваемый модуль 12, обозначение 3.8, обозначение типа 2, объект 3.2, ограничение 3.3, ограничение диапазона 3.5, ограничение дискриминанта 2, ограничение индекса 1, оператор блока 5.6, операция 3, отрезок 2, ошибочная ситуация 11, ошибочный 1.6, предвыполнение 3.1, 3.9, подпрограмма 6, подтип 3.3, прагма 2.8, программный модуль 6, простое имя 4.1, раздел описаний 3.9, размерность 3.6, распространение исключения 11.4, расширенное имя 3, совместимый 2, составной тип 3.3, спецификация пакета 7.1, ссылочное значение 3.8, ссылочный тип 3.8, субмодуль 10.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тип 3.3, числовая операция 5, 8, 10, числовой тип