Перейти к основному содержимому

Исключения

В любой программе могут возникнуть ошибки: деление на ноль, открытие несуществующего файла, неверный формат ввода. Если такие ситуации не обработать, программа завершится аварийно. В Python ошибки перехватывают с помощью инструкции try ... except, а в языке «1С:Элемент» — с помощью инструкции попытка ... поймать.

В Python «подозрительный» код помещают в блок try:, а реакцию на ошибку — в блок except ТипОшибки as e:. Здесь e — это переменная, в которую попадает сам объект ошибки: из него можно узнать ее описание и другие подробности.

В языке «1С:Элемент» действует та же логика, но записывается иначе. Блоку try: соответствует блок попытка, а обработка исключения происходит в блоке поймать ИмяПеременной: ТипИсключения. Имя переменной здесь играет ту же роль, что e в Python: в нее попадает объект исключения, и из него можно получить сообщение об ошибке. Блок целиком завершается символом ;.

В Python после except можно указать любой класс ошибок — от точного (ValueError) до самого общего (Exception), который ловит все ошибки. В языке «1С:Элемент» действует та же логика: помимо конкретных типов вроде ИсключениеНедопустимыйФормат и ИсключениеНедопустимыйАргумент, есть базовый тип Исключение, который работает аналогично Exception в Python. Имена конкретных типов точно описывают причину возникновения ошибки. Это помогает сразу понять, что именно пошло не так, и не путать, например, ошибку нарушения формата с ошибкой передачи недопустимого аргумента.

Бывает и так, что какой-то код нужно выполнить в любом случае — была ошибка или нет. В Python для этого служит блок finally: он срабатывает и после штатного завершения блока try, и после обработки ошибки в except. В языке «1С:Элемент» аналогичную роль играет блок вконце — он записывается после поймать и тоже выполняется всегда.

Python
def divide_numbers(а, b):
result = None
message = ""

try:
result = float(а) / float(b)
message = f"Результат деления: {result}."
except ZeroDivisionError:
message = "На ноль делить нельзя!"
finally:
message += " Программа выполнена."

return message
«1С:Элемент»
метод ВыполнитьДеление(А: Число, Б: Число): Строка
пер Результат: Число
пер Сообщение = ""

попытка
Результат = А / Б
Сообщение = "Результат деления: %Результат."
поймать Искл: ИсключениеАрифметики
Сообщение = "На ноль делить нельзя!"
вконце
Сообщение += " Программа выполнена."
;

возврат Сообщение
;

Наконец, рассмотрим, как сами исключения вызываются в программе. В Python для этого служит оператор raise. Запись raise ValueError("текст") создает ошибку с заданным сообщением и прерывает выполнение. В языке «1С:Элемент» аналогично работает инструкция выбросить. Запись выбросить новый ИсключениеНедопустимыйАргумент("текст") создает новый объект исключения с указанным сообщением и выбрасывает его. Дальше его можно перехватить в подходящем блоке поймать.

Python
def validate_age(age):
if age < 0:
raise ValueError('Возраст не может быть отрицательным')
«1С:Элемент»
метод ПроверитьВозраст(Возраст: Число)
если Возраст < 0
выбросить новый ИсключениеНедопустимыйАргумент("Возраст не может быть отрицательным")
;
;