Обработка исключений в Python
26.02.2018
Теги: Python • Web-разработка • Исключение
При выполнении программы могут произойти два типа ошибок: синтаксические ошибки (syntax error) и ошибки выполнения (runtime error). Синтаксические ошибки появляются в результате нарушения синтаксиса. Runtime error появляются в уже в процессе выполнения, их еще называют исключениями.
Рассмотрим пример:
string = "hello" number = int(string) print(number)
При выполнении этого скрипта будет выброшено исключение ValueError
, так как строку "hello"
нельзя преобразовать в число.
При возникновении исключения работа программы прерывается, и чтобы избежать подобного поведения и обрабатывать исключения — есть конструкция try…except
:
try: инструкции except [ТипИсключения]: инструкции
Код, в котором может возникнуть исключение, помещается после ключевого слова try
. При возникновении исключения, работа кода в блоке try
прерывается, и выполнение переходит в блок except
.
После ключевого слова except
опционально можно указать, какое исключение будет обрабатываться (например, ValueError
или KeyError
).
Рассмотрим обработку исключения на примере преобразовании строки в число:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except: print("Преобразование прошло неудачно") print("Завершение программы")
Введите число: hello Преобразование прошло неудачно Завершение программы
Как видно из консольного вывода, при вводе строки вывод числа на консоль не происходит, а выполнение программы переходит к блоку except
.
В примере выше обрабатывались сразу все исключения, которые могут возникнуть в коде. Однако мы можем конкретизировать тип обрабатываемого исключения, указав его после слова except
:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError: print("Преобразование прошло неудачно") print("Завершение программы")
Если ситуация такова, что в программе могут быть сгенерированы различные типы исключений, то мы можем их обработать по отдельности, используя дополнительные выражения except
:
try: number1 = int(input("Введите первое число: ")) number2 = int(input("Введите второе число: ")) print("Результат деления:", number1/number2) except ValueError: print("Преобразование прошло неудачно") except ZeroDivisionError: print("Попытка деления числа на ноль") except Exception: print("Общее исключение") print("Завершение программы")
Если возникнет исключение в результате преобразования строки в число, то оно будет обработано блоком except ValueError
. Если же второе число будет равно нулю, то есть будет деление на ноль, тогда исключение будет обработано блоком except ZeroDivisionError
.
Тип Exception
представляет общее исключение, под которое попадают все исключительные ситуации. Поэтому в данном случае любое исключение, которое не представляет тип ValueError
или ZeroDivisionError
, будет обработано в блоке except Exception
.
При обработке исключений также можно использовать необязательный блок finally
. Отличительной особенностью этого блока является то, что он выполняется вне зависимости, было ли сгенерировано исключение:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError: print("Не удалось преобразовать число") finally: print("Блок try завершил выполнение") print("Завершение программы")
Как правило, блок finally
применяется для освобождения используемых ресурсов, например, для закрытия файлов.
С помощью оператора as
мы можем передать всю информацию об исключении в переменную, которую затем можно использовать в блоке except
:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError as e: print("Сведения об исключении: " + str(e)) print("Завершение программы")
Введите число: hello Сведения об исключении: invalid literal for int() with base 10: 'hello' Завершение программы
Иногда возникает необходимость вручную сгенерировать то или иное исключение. Для этого применяется оператор raise
.
try: number1 = int(input("Введите первое число: ")) number2 = int(input("Введите второе число: ")) if number2 == 0: raise Exception("Второе число не должно быть равно нулю") print("Результат деления двух чисел:", number1/number2) except ValueError: print("Введены некорректные данные") except Exception as e: print(str(e)) print("Завершение программы")
При вызове исключения мы можем ему передать сообщение, которое затем можно вывести пользователю:
Введите первое число: 1 Введите второе число: 0 Второе число не должно быть равно 0 Завершение программы
Если при обработке исключения надо пробросить его еще выше, то следует написать такой код:
try: инструкции except: raise
Дополнительно:
Поиск: Python • Web-разработка • Исключение