Перевод на русский язык
Привет, стремящиеся стать питонистами! Сегодня мы погружаемся в захватывающий мир вызова исключений в Python. Не волнуйтесь, если вы новичок в программировании – я веду вас по этой концепции шаг за шагом, как я делал это для множества студентов на протяжении многих лет своей преподавательской деятельности. Так что возьмите стакан вашего любимого напитка, и давайте отправимся в эту питоновскую приключение вместе!
Вызов исключений в Python
Представьте себе, что вы готовите вкусное блюдо, но вдруг понимаете, что закончилось ключевое ингредиент. Что вы делаете? Вероятно, остановите приготовление и сообщите всем о проблеме, правильно? Вот и в Python вызов исключений – это способ сигнализировать о том, что в вашем коде произошло неожиданное или проблематичное событие.
Почему вызывать исключения?
Вызов исключений позволяет нам:
- Указывать на ошибки или необычные ситуации
- Контролировать поток выполнения нашей программы
- Предоставлять пользователейм или другим частям кода значимые отзывы
Начнем с простого примера:
def divide(a, b):
if b == 0:
raise ValueError("Нельзя делить на ноль!")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"Ой! Произошла ошибка: {e}")
В этом примере мы вызываем ValueError
, когда кто-то пытается разделить на ноль. Разберемся:
- Мы определяем функцию
divide(a, b)
, которая проверяет, равен лиb
нулю. - Если
b
равен нулю, мы вызываемValueError
с пользовательским сообщением. - Мы используем блок
try-except
, чтобы перехватить исключение и вывести дружественное сообщение.
Когда вы выполните этот код, вы увидите:
Ой! Произошла ошибка: Нельзя делить на ноль!
Вызов встроенных исключений
Python предоставляет множество встроенных исключений, которые мы можем вызвать. Вот таблица некоторых из них:
Исключение | Описание |
---|---|
ValueError | Вызывается, когда функция получает аргумент правильного типа, но неподходящего значения |
TypeError | Вызывается, когда операция или функция применяется к объекту неподходящего типа |
IndexError | Вызывается, когда подписка на последовательность выходит за диапазон |
KeyError | Вызывается, когда ключ словаря не найден |
FileNotFoundError | Вызывается, когда запрашивается файл или каталог, которого не существует |
Посмотрим на некоторые примеры:
def check_age(age):
if not isinstance(age, int):
raise TypeError("Возраст должен быть целым числом")
if age < 0:
raise ValueError("Возраст не может быть отрицательным")
print(f"Ваш возраст {age}")
try:
check_age("двадцать")
except TypeError as e:
print(f"Ошибка типа: {e}")
try:
check_age(-5)
except ValueError as e:
print(f"Ошибка значения: {e}")
Когда вы выполните этот код, вы увидите:
Ошибка типа: Возраст должен быть целым числом
Ошибка значения: Возраст не может быть отрицательным
Вызов пользовательских исключений
Иногда встроенные исключения просто не хватает. Тогда мы создаем свои собственные пользовательские исключения! Это как быть шеф-поваром и создавать свои уникальные рецепты.
Создание пользовательских исключений
Чтобы создать пользовательское исключение, мы просто определяем новый класс, который наследуется от класса Exception
:
class TooManyPizzasError(Exception):
pass
def order_pizza(number):
if number > 100:
raise TooManyPizzasError("Ух! Это слишком много пицц для обработки!")
print(f"Заказ подтвержден: {number} пицц")
try:
order_pizza(101)
except TooManyPizzasError as e:
print(f"Заказ не выполнен: {e}")
В этом вкусном примере:
- Мы определяем пользовательское исключение
TooManyPizzasError
. - Наша функция
order_pizza
вызывает это исключение, если кто-то заказывает больше 100 пицц. - Мы перехватываем исключение и выводим дружественное сообщение.
Когда вы выполните этот код, вы увидите:
Заказ не выполнен: Ух! Это слишком много пицц для обработки!
Перевызов исключений
Иногда вы можете захотеть перехватить исключение, сделать с ним что-то, а затем перевызвать его для обработки кем-то другим. Это как передача горячего картофеля в игре!
Вот как это можно сделать:
def risky_operation():
print("Начало рискованной операции...")
raise ValueError("Что-то пошло не так!")
def perform_operation():
try:
risky_operation()
except ValueError:
print("Поймали ошибку, логируем ее...")
raise # Перевызов исключения
try:
perform_operation()
except ValueError as e:
print(f"Операция не выполнена: {e}")
В этом примере:
-
risky_operation()
всегда вызываетValueError
. -
perform_operation()
перехватывает исключение, логирует его, а затем перевызывает. - Мы перехватываем перевызванное исключение во внешнем блоке
try-except
.
Когда вы выполните этот код, вы увидите:
Начало рискованной операции...
Поймали ошибку, логируем ее...
Операция не выполнена: Что-то пошло не так!
Итак, друзья! Мы покрыли вызов исключений, встроенные исключения, пользовательские исключения и даже перевызов исключений. Помните, исключения – это не ваши враги, это ценные инструменты, которые помогают вам писать надежный и устойчивый к ошибкам код.
Как я всегда говорю своим студентам, программирование – это как учиться ездить на велосипеде. Вы можете упасть несколько раз, но каждое падение (или исключение) учит вас чему-то новому. Постоянно практикуйтесь, будьте любознательными и не бойтесь вызывать несколько исключений на своем пути!
Счастливого кодинга, и пусть ваши исключения всегда будут намеренными! ?✨
Credits: Image by storyset