Оператор Попытка управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях, и определяет обработку этих ситуаций. В качестве ошибочных (исключительных) ситуаций воспринимаются ошибки времени выполнения модуля. Не предусмотрено определяемых пользователем исключений. Если при выполнении последовательности операторов попытки произошла ошибка времени выполнения, то выполнение оператора, вызвавшего ошибку, прерывается и управление передается на первый оператор последовательности операторов исключения. При этом управление будет передано даже в том случае, если ошибку вызвал оператор, находящийся в процедуре или функции, вызванной из операторов попытки. Если ошибка произошла в вызванной процедуре или функции, то ее выполнение будет прервано, а локальные переменные – уничтожены. Это справедливо для любой вложенности вызовов. После выполнения последовательности операторов исключения управление передается на следующий за ключевым словом КонецПопытки оператор. Если же последовательность операторов попытки выполнилась без ошибок, то последовательность операторов исключения будет пропущена и управление также будет продолжено с оператора, следующего за ключевым словом КонецПопытки. Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом, при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения
Синтаксис
Попытка
// Операторы попытки
Исключение
// Операторы
исключения
[ВызватьИсключение;]
// Операторы исключения
КонецПопытки;Полное описание, параметры и ограничения
Попытка (Try)
Попытка (Try)
Синтаксис:
Попытка
// Операторы попытки
Исключение
// Операторы
исключения
[ВызватьИсключение;]
// Операторы исключения
КонецПопытки;
Параметры:
// Операторы попытки
Исполняемый оператор или последовательность таких операторов.
Исключение
Операторы, следующие за ключевым словом Исключение выполняются, если при выполнении последовательности операторов произошла ошибка времени выполнения.
// Операторы исключения
Исполняемый оператор или последовательность операторов, которые обрабатывают исключительную ситуацию.
ВызватьИсключение
Оператор позволяет вызвать исключение в тех случаях, когда несмотря на отработку исключительной ситуации операторами исключения необходимо прервать выполнение модуля с ошибкой времени выполнения. Оператор допустим только внутри операторных скобок Исключение – КонецПопытки.
Выполнение данного оператора прекращает выполнение последовательности операторов исключения и производит поиск более "внешнего" обработчика исключения (при вложенных попытках). Если таковой есть, то управление передается на его первый оператор. Если нет, то исключительная ситуация обрабатывается системно, выдается сообщение о первоначально возникшей ошибке, а выполнение модуля прекращается.
КонецПопытки
Ключевое слово, которое завершает структуру оператора обработки исключительных ситуаций.
Описание:
Оператор Попытка управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях, и определяет обработку этих ситуаций. В качестве ошибочных (исключительных) ситуаций воспринимаются ошибки времени выполнения модуля. Не предусмотрено определяемых пользователем исключений.
Если при выполнении последовательности операторов попытки произошла ошибка времени выполнения, то выполнение оператора, вызвавшего ошибку, прерывается и управление передается на первый оператор последовательности операторов исключения. При этом управление будет передано даже в том случае, если ошибку вызвал оператор, находящийся в процедуре или функции, вызванной из операторов попытки. Если ошибка произошла в вызванной процедуре или функции, то ее выполнение будет прервано, а локальные переменные – уничтожены. Это справедливо для любой вложенности вызовов. После выполнения последовательности операторов исключения управление передается на следующий за ключевым словом КонецПопытки оператор. Если же последовательность операторов попытки выполнилась без ошибок, то последовательность операторов исключения будет пропущена и управление также
будет продолжено с оператора, следующего за ключевым словом КонецПопытки.
Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом, при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения этого обработчика выполняется оператор ВызватьИсключение, выполнение передается вышестоящему обработчику исключения и так далее. Если вышестоящего обработчика нет, исключительная ситуация обрабатывается системно с прекращением выполнения программного модуля.
В процессе работы встроенного языка иногда возникает необходимость в компиляции модулей. Если текст компилируемого модуля содержит ошибки, то компиляция модуля не может быть успешно завершена и вызывается исключение. Такое исключение является невосстановимым, не может быть перехвачено и обработано конструкцией Попытка – Исключение – КонецПопытки, и, в конечном счете, приводит к завершению работы системы. Также к невосстановимому исключению приводит любая ошибка выполнения встроенного языка, возникшая в процессе инициализации модуля (выполнения тела модуля). После такой ошибки система также не может продолжать работу, так как объект, которому принадлежит модуль, фактически оказывается неинициализированным.
См. также:
Метод ИнформацияОбОшибке(),
Метод ОписаниеОшибки().
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Попытка: обработать учебную ошибку и продолжить программу
При исключении оставшаяся часть попытки пропускается. Управление переходит в Исключение, затем к коду после КонецПопытки.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
ОшибкаОбработана = Ложь;
Делитель = 0;
Попытка
Результат = 10 / Делитель;
Сообщить(Результат);
Исключение
ОшибкаОбработана = Истина;
Сообщить("Учебное деление на ноль обработано");
КонецПопытки;
Сообщить(ОшибкаОбработана);
Сообщить("Программа дошла до следующей строки");
КонецПроцедурыРазбор по шагам
Намеренно задать собственный делитель 0, не исполнять опасных внешних операций.
Деление вызывает ошибку; вывод Результат в попытке не выполняется.
Обработчик ставит флаг и сообщает понятное учебное сообщение.
После КонецПопытки выводится флаг и следующая строка.
Как проверить результат
Сообщение об обработанной ошибке, Истина, затем Программа дошла до следующей строки.
Поставьте делитель 2: будет 5, флаг Ложь и сообщение о продолжении.
Ожидаемый результат
Ошибка не скрыта пустым обработчиком, а последовательность выполнения видна в сообщениях.
На что обратить внимание
Попытка не делает неправильные данные правильными.
В производственном коде нужны диагностика и решение, можно ли продолжать.
Не гасите ошибки записи данных пустым Исключение.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Дополнительные параметры исключения: сохранить причину ошибки расчёта
Сначала создаём собственную ошибку ввода, затем оборачиваем её понятной ошибкой операции, сохраняя исходную причину отдельным объектом.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
ОшибкаОбработана = Ложь;
Попытка
ПроверитьУчебнуюПокупку(0);
Исключение
ОшибкаОбработана = Истина;
Ошибка = ИнформацияОбОшибке();
Сообщить(Ошибка.Код = "training.purchase.failed");
Сообщить(Ошибка.ДополнительнаяИнформация = "Собственная задача: книги по 250");
Сообщить(Ошибка.ЯвляетсяОшибкойКатегории(КатегорияОшибки.ОшибкаКонфигурации, Ложь));
Если Ошибка.Причина = Неопределено Тогда
ВызватьИсключение "Учебная проверка не нашла сохранённую причину";
КонецЕсли;
Сообщить(Ошибка.Причина.Код = "training.quantity.range");
Сообщить(Ошибка.Причина.ДополнительнаяИнформация = "Собственное количество должно быть от 1 до 10");
Сообщить(Ошибка.Описание);
Сообщить(Ошибка.Причина.Описание);
КонецПопытки;
Сообщить(ОшибкаОбработана);
КонецПроцедуры
Процедура ПроверитьУчебнуюПокупку(Знач Количество)
Попытка
ПроверитьУчебноеКоличество(Количество);
Исключение
Причина = ИнформацияОбОшибке();
ВызватьИсключение("Учебную покупку рассчитать нельзя", КатегорияОшибки.ОшибкаКонфигурации,
"training.purchase.failed", "Собственная задача: книги по 250", Причина);
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьУчебноеКоличество(Знач Количество)
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Передайте собственное числовое количество";
КонецЕсли;
Если Количество < 1 ИЛИ Количество > 10 ИЛИ Количество <> Цел(Количество) Тогда
ВызватьИсключение("Неверное учебное количество", КатегорияОшибки.ОшибкаКонфигурации,
"training.quantity.range", "Собственное количество должно быть от 1 до 10");
КонецЕсли;
КонецПроцедурыРазбор по шагам
Внутренняя функция проверяет собственное число 0. Она создаёт ошибку с категорией ОшибкаКонфигурации и отдельным кодом training.quantity.range.
В следующем обработчике получить первичную ошибку в переменную Причина. Получать её надо до создания нового исключения.
Новый пятиаргументный ВызватьИсключение получает строку, допустимую категорию, строковый код, дополнительный текст и первичную ИнформацияОбОшибке.
Внешний обработчик проверяет код операции, затем наличие причины, а уже после этого обращается к её полям.
ЯвляетсяОшибкойКатегории с Ложь проверяет только текущую ошибку. Текст и код исходного неверного количества не теряются в строковом склеивании.
Как проверить результат
Шесть логических проверок Истина, а также два описания ошибок. Служебные строки и формат описаний заранее не фиксируются.
Вызовите ПроверитьУчебнуюПокупку(3): исключения нет, внешний обработчик не выполняется, последний флаг Ложь. Это положительный вариант, не потерянная диагностика.
Ожидаемый результат
Разобраны собственный код ошибки, разрешённая категория, цепочка причин и правильное место получения диагностики.
На что обратить внимание
Нельзя передавать в параметре категории ВсеОшибки, ПрочаяОшибка, ОшибкаКомпиляцииВстроенногоЯзыка, ОшибкаВоВремяВыполненияВстроенногоЯзыка и ИсключениеВызванноеИзВстроенногоЯзыка.
Причина — объект ИнформацияОбОшибке, не строка ОписаниеОшибки. Свойства полученной диагностики доступны только для чтения.
ДополнительнаяИнформация здесь содержит только собственное учебное правило. Не помещайте туда пароли, токены и содержимое рабочих документов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.