Python предоставляет мощные инструменты для обработки исключений, которые помогают поддерживать работоспособность программы даже при возникновении ошибок. Основными конструкциями для этого являются try
, except
, else
, и finally
.
Стандартная конструкция try
/except
выглядит так:
try:
# код, который может вызвать ошибку
except Ошибка:
# код, который будет выполняться, если в блоке try возникла ошибка
Пример:
try:
# Код, который может вызвать исключение
result = 10 / 0
except ZeroDivisionError:
# Код, который выполняется при возникновении исключения ZeroDivisionError
print("На ноль делить нельзя!")
ZeroDivisionError
- ошибка, которая, как вы поняли, возникает при делении на ноль. Этих ошибок много, о них я расскажу в следующей статье.
try
/except
/finally
Блок finally
выполняется всегда, независимо от того, возникло исключение или нет
try:
# блок, который может вызвать ошибку
except Ошибка:
# код, который будет выполняться, если в блоке try возникла ошибка
finally:
# выполняется всегда
Пример:
def exception_test(value):
try:
result = 10 / value
print(result)
except ZeroDivisionError:
print("На ноль делить нельзя!")
finally:
print("Функция все равно выполнилась")
exception_test(10) # 1.0 Функция все равно выполнилась
exception_test(0) # На ноль делить нельзя! Функция все равно выполнилась
try
/except
/else
А вот блок else
выполняется, если код в блоке try
не вызвал ошибок:
try:
# блок, который может вызвать ошибку
except Ошибка:
# код, который будет выполняться, если в блоке try возникла ошибка
else:
# выполняется если в блоке try нет ошибок
Пример:
def exception_test(value):
try:
result = 10 / value
print(result)
except ZeroDivisionError:
print("На ноль делить нельзя!")
else:
print("Ошибок нет")
exception_test(10) # 1.0 Ошибок нет
exception_test(0) # На ноль делить нельзя!
Давайте объединим все варианты воедино
def exception_test(value):
try:
result = 10 / value
print(result)
except ZeroDivisionError:
print("На ноль делить нельзя!")
else:
print("Ошибок нет.")
finally:
print("Функция выполнилась.")
exception_test(10) # 1.0 Ошибок нет. Функция выполнилась.
exception_test(0) # На ноль делить нельзя! Функция выполилась.
def exception_test(value):
try:
result = 10 / value
print(result)
except ZeroDivisionError:
print("На ноль делить нельзя!")
except TypeError:
print("Аргумент должен иметь числовой тип")
exception_test(0) # На ноль делить нельзя!
exception_test("a") # Аргумент должен иметь числовой тип
Также можно объединить ошибки вот так:
def exception_test(value):
try:
result = 10 / value
print(result)
except (ZeroDivisionError, TypeError):
print("Передано неправильное знаение")
exception_test(0) # Передано неправильное значение
exception_test("a") # Передано неправильное знаение
Еще есть возможность присвоить переменной экземпляр ошибки, чтобы затем ее использовать:
def exception_test(value):
try:
result = 10 / value
print(result)
except (ZeroDivisionError, TypeError) as error:
print(f"Передано неправильное значение. Ошибка {error}")
exception_test(0) # Передано неправильное значение. Ошибка division by zero
exception_test("a") # Передано неправильное значение. Ошибка unsupported operand type(s) for /: 'int' and 'str'
Объектно-ориентированное программирование - одна из самых распространенных парадигм. Знание ООП позволит сделать код более гибким и масштабируемым
Для написания сложных программ необходимо использовать сторонние библиотеки. Они позволяют использовать готовый функционал. Также можно использовать модули для компоновки вашего приложения.
В Python 3.10 был добавлен новый функционал - сопоставление с шаблонами с помощью ключевых слов match и case. В статье также рассматривается производительность match/case по сравнению с if/else.
В этой статье описано, что означают различные классы исключений. Также рассмотрено создание собственных классов исключений.