TRY [ [ TryAttributes ] ] (* защищенный код *) EXCEPT { ON var: Exc_Root DO (* код обработчика исключения *) |
Зарезервированные слова 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-блока, связи сообщений с исключениями см. в статье "Управление исключениями".