TRY - EXCEPT - ELSE - FINALLY - END


Синтаксис

TRY [ [ TryAttributes ] ]
 (* защищенный код *)
EXCEPT
{
 ON var: Exc_Root DO
  (* код обработчика исключения *)
} [ ELSE (* код обработчика по умолчанию *) ] [ FINALLY (* код гарантированного завершения *) ] END TryAttributes = TryAttributeName ( TryAttributeValue ) { , TryAttributeName ( TryAttributeValue ) } TryAttributeName = ABORT_AFTER | EXCEPTION_HANDLING | INTEGRITY | MSG_SUPPRESSION | RESTORE_CURSORS | TABLE_FILTER_MODE | CHECK_USER_INPUT | TERM_BY_USER | TRANSACTION

Описание

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

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

Блок кода гарантированного завершения начинается зарезервированным словом FINALLY. Код, расположенный между FINALLY и END, выполнится при любом завершении TRY-блока: а) исключения не было; б) исключение было обработано; в) исключение не было обработано. В двух последних случаях код гарантированного завершения выполняется после обработчика исключения.

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

Название атрибута Смысл Допустимые значения Значение по умолчанию Наследование Комментарий
вложен-ным TRY-блоком вложен-ным про-грамм-ным комп-лексом
ABORT_AFTER Нужно ли инициировать откат уровня транзакции при выходе из TRY См. набор констант ABORT_AFTER AA_OFF

Нет

 
EXCEPTION_HANDLING, EXCEPTIONHANDLING (устар. имя) Реакции исполнительной системы на выброс и обработку исключения См. набор констант EXCEPTION_HANDLING EXCEPRION_HANDLING_ON Нет  
INTEGRITY Режим контроля целостности данных См. набор констант INTEGRITY INTEGRITY_OFF Да Нет  
MSG_SUPPRESSION, MSGSUPPRESSIONMODE (устар. имя) Режим подавления сообщений MSG_SUPPRESSION_NONE и MSG_SUPPRESSION_ALL из набора констант MSG_SUPPRESSION Зависит от атрибута TRANSACTION: для TRANSACTION_CURRENT - MSG_SUPPRESSION_NONE, для TRANSACTION_SLAVE - MSG_SUPPRESSION_ALL Да, попытки понижения игнорируются Для DBS-программы (вне отладчика) система автоматически устанавливает MSG_SUPPRESSION_ALL, для NTF-программы - MSG_SUPPRESSION_INFINITE
RESTORE_CURSORS Восстанавливать ли позиции курсоров при успешном выходе из TRY-блока (т.е. при фиксации уровня транзакции) См. набор констант RESTORE_CURSORS Зависит от атрибута TRANSACTION: для TRANSACTION_CURRENT - RC_OFF, для TRANSACTION_SLAVE - RC_ON Нет  
TABLE_FILTER_MODE Режим работы файловых фильтров для транзакции, т.е. для всех таблиц БД См. набор констант TABLE_FILTER_MODE TABLE_FILTER_MODE_ON Да Нет Если при входе в TRY или выходе из него фильтры переключаются в режим "включено", сбрасываются позиции курсоров, которые попадают под действия фильтров. Подробнее см. TABLE.Filter
CHECK_USER_INPUT Проверять ли ввод пользователя См. набор констант CHECK_USER_INPUT В непрерываемых обработчиках событий, в телах инициализации библиотек, в программных комплексах NTF, в STDFORM (внутри idleFunc и onChangeProc) - CUI_OFF, иначе - CUI_ON

Да

Добавлен в версии 14.265.070.

В телах инициализации библиотек, в программных комплексах NTF, в STDFORM (внутри idleFunc и onChangeProc) попытки установить CUI_ON игнорируются.

В ходе разбора определений модуля ввод пользователя не проверяется

TERM_BY_USER, TERMBYUSERMODE (устар. имя) Реакция исполнительной системы на попытку пользователя прервать исполнение программы в пределах защищенного кода TRY-блока, а также способность обработчиков TRY-блока перехватывать исключения Exc_TermByUser См. набор констант TERM_BY_USER TERM_BY_USER_ABORT

Да, попытки понижения игнорируются. См. TERM_BY_USER

Когда действует режим проверки ввода пользователя CUI_OFF, значение данного атрибута значения не имеет
TRANSACTION Транзакция TRY-блока: либо новый уровень текущей транзакции, либо подчиненная транзакция См. набор констант TRANSACTION TRANSACTION_CURRENT Нет  

Очевидно, что действие перечисленных атрибутов распространяется на собственный TRY-блок. Кроме этого в пределах TRY-блока работают: установка режимов доступа данным (см. TABLE.AccessDataMode, TRY_BLOCK.AccessDataMode), установка привилегированных прав доступа (см. GRANT_ALL_RIGHTS)

При входе в TRY-блок порождается новый уровень текущей транзакции (TRANSACTION_CURRENT) или подчиненная транзакция (TRANSACTION_SLAVE). В случае нормального выхода из TRY-блока уровень транзакции или подчиненная транзакция успешно завершается, код обработчиков игнорируется, код гарантированного завершения выполняется, после чего исполнение продолжается с точки за концом TRY-блока.

При выбрасывании исключения стек разматывается до ближайшего TRY-блока. Соответствующий TRY-блоку уровень транзакции (или подчиненная транзакция) откатывается, курсоры таблиц БД восстанавливаются. Если среди обработчиков TRY-блока нет подходящего по типу, выполняется код гарантированного завершения, исключение пробрасывается следующему TRY-блоку. Если среди обработчиков TRY-блока найден подходящий, выполняется код обработчика. В случае благополучного выхода из обработчика исключение считается обработанным, выполняется блок гарантированного завершения, затем исполнение продолжается с точки за концом TRY-блока. Если обработчик исключения по каким-то причинам не может обработать исключение, он имеет право пробросить это исключение далее (охватывающему TRY-блоку) при помощи процедуры RAISE (вариант без параметров). Кроме того, код обработчика может выбросить новое исключение. В обоих случаях, прежде чем разматывать стек до следующего TRY-блока, выполняется блок гарантированного завершения.

Блок гарантированного завершения выполняется в частности для необработанного исключения класса Exc_TermByUser в TRY-блоке, неспособном к перехвату Ex_TermByUser, когда подходящий обработчик исключений даже не разыскивается. Однако блок гарантированного завершения не выполняется для неперехватываемых исключений (300 и 311).

В блоке гарантированного завершения запрещены операторы EXIT, RETURN и HALT(0), в случае исполнения одного из них будет выброшено исключение 534. Проблема в том, что необработанное исключение после исполнения кода гарантированного завершения должно быть проброшено далее по стеку, а перечисленные операторы предполагают иной порядок работы.

Подробнее об обработке исключений, транзакции TRY-блока, связи сообщений с исключениями см. в статье "Управление исключениями".