Python - Обработка исключений

Привет, будущие волшебники Python! Я рад быть вашим гидом в этом увлекательном путешествии по миру обработки исключений в Python. Как человек, который многие годы преподает программирование, я могу вам сказать, что понимание исключений похоже на то, как научиться ездить на велосипеде с подручными: сначала это может показаться сложным, но как только вы освоите это, вы будете ездить без труда!

Python - Exceptions

Что такое исключение?

Перед тем как погружаться в глубины, начнем с основ. Представьте себе, что вы пекете торт (продолжайте следовать мне, я обещаю, это связано с Python!). У вас есть рецепт (ваш код), ингредиенты (ваши данные), и вы готовы начать. Но что, если в середине вы обнаружите, что закончились яйца? Это исключение в мире пекарства!

В Python исключение — это ошибка, которая возникает во время выполнения программы. Это как красный флаг, который появляется и говорит: "Стой! Не все в порядке!"

Посмотрим на простой пример:

print(10 / 0)

Если вы выполните этот код, Python поднимет исключение ZeroDivisionError. Он говорит: "Эй, вы не можете делить на ноль! Это не разрешается в моей кухне... Я имею в виду, в программировании!"

Обработка исключений в Python

Теперь, когда мы знаем, что такое исключения, давайте научимся обрабатывать их грациозно. В Python мы используем блоки try и except для перехвата и обработки исключений.

Вот базовая структура:

try:
# Код, который может вызвать исключение
except ТипИсключения:
# Код для обработки исключения

Поправим наш предыдущий пример:

try:
result = 10 / 0
print(result)
except ZeroDivisionError:
print("Ой! Вы не можете делить на ноль.")

Когда вы выполните этот код, вместо сбоя, он напечатает: "Ой! Вы не можете делить на ноль."

Клауза except без указания исключений

Иногда вы можете захотеть перехватить любое исключение, которое возникает. В этом случае вы можете использовать клаузу except без указания типа исключения:

try:
# Некоторый рискованный код
x = int(input("Введите число: "))
y = 10 / x
print(y)
except:
print("Что-то пошло не так!")

Это перехватит любое исключение, которое возникает в блоке try. Однако, обычно лучше перехватывать конкретные исключения, когда это возможно, так как это делает ваш код более точным и легче для отладки.

Клауза except с несколькими исключениями

Вы также можете обработить несколько исключений в одной клаузе except:

try:
x = int(input("Введите число: "))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("Неверный ввод или деление на ноль!")

Этот код перехватит как ValueError (если пользователь введет нечисловое значение), так и ZeroDivisionError.

Клауза try-finally

Клауза finally используется для кода, который должен быть выполнен независимо от того, возникло исключение или нет. Это как команда уборки после вечеринки - она всегда появляется, неimporte как прошла вечеринка!

try:
f = open("example.txt", "r")
# Выполните некоторые операции с файлом
except FileNotFoundError:
print("Файл не существует!")
finally:
f.close()  # Это всегда выполнится, даже если возникло исключение

Аргумент исключения

Исключения могут содержать дополнительную информацию. Вы можете получить доступ к этой информации в вашем блоке except:

try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"Произошла ошибка: {e}")

Это напечатает: "Произошла ошибка: деление на ноль"

Вызов исключения

Иногда вы можете захотеть вызвать исключение сами. Это как быть судьей в игре и засчитать фол:

def check_age(age):
if age < 0:
raise ValueError("Возраст не может быть отрицательным!")
print(f"Ваш возраст {age}")

try:
check_age(-5)
except ValueError as e:
print(e)

Это напечатает: "Возраст не может быть отрицательным!"

Пользовательские исключения

Вы также можете создавать свои собственные типы исключений. Это как изобрести новое правило в игре:

class TooManyPizzasError(Exception):
pass

def order_pizza(number):
if number > 100:
raise TooManyPizzasError("Вы не можете заказать более 100 пицц!")
print(f"Заказ на {number} пицц успешно размещен.")

try:
order_pizza(101)
except TooManyPizzasError as e:
print(e)

Утверждения в Python

Утверждения — это способ убедиться, что определенные условия выполнены. Они похожи на маленькие контрольные точки в вашем коде:

def divide(a, b):
assert b != 0, "Делитель не может быть нулем!"
return a / b

try:
result = divide(10, 0)
except AssertionError as e:
print(e)

Это напечатает: "Делитель не может быть нулем!"

Стандартные исключения

Python поставляется с набором встроенных исключений. Вот некоторые из самых распространенных:

Название исключения Описание
ZeroDivisionError Вызывается при делении или взятии остатка от ноля
ValueError Вызывается, когда функция получает аргумент правильного типа, но неправильного значения
TypeError Вызывается, когда операция или функция применяется к объекту неправильного типа
NameError Вызывается, когда локальное или глобальное имя не найдено
FileNotFoundError Вызывается, когда запрашиваемый файл или каталог не существует
IndexError Вызывается, когда подпись последовательности выходит за пределы диапазона
KeyError Вызывается, когда ключ словаря не найден
ImportError Вызывается, когда неудачно выполняется оператор импорта

Итак, вот и все, друзья! Вы только что завершили свой краткий курс по обработке исключений в Python. Помните, исключения — это не ваши враги, это скорее полезные знаки, направляющие вас к лучшему, более надежному коду. Постарайтесь, экспериментируйте, и скоро вы будете обрабатывать исключения как профи. Счастливого кодирования!

Credits: Image by storyset