Перевод на русский язык

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

Python - Raising Exceptions

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

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

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

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

  1. Указывать на ошибки или необычные ситуации
  2. Контролировать поток выполнения нашей программы
  3. Предоставлять пользователейм или другим частям кода значимые отзывы

Начнем с простого примера:

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, когда кто-то пытается разделить на ноль. Разберемся:

  1. Мы определяем функцию divide(a, b), которая проверяет, равен ли b нулю.
  2. Если b равен нулю, мы вызываем ValueError с пользовательским сообщением.
  3. Мы используем блок 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}")

В этом вкусном примере:

  1. Мы определяем пользовательское исключение TooManyPizzasError.
  2. Наша функция order_pizza вызывает это исключение, если кто-то заказывает больше 100 пицц.
  3. Мы перехватываем исключение и выводим дружественное сообщение.

Когда вы выполните этот код, вы увидите:

Заказ не выполнен: Ух! Это слишком много пицц для обработки!

Перевызов исключений

Иногда вы можете захотеть перехватить исключение, сделать с ним что-то, а затем перевызвать его для обработки кем-то другим. Это как передача горячего картофеля в игре!

Вот как это можно сделать:

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}")

В этом примере:

  1. risky_operation() всегда вызывает ValueError.
  2. perform_operation() перехватывает исключение, логирует его, а затем перевызывает.
  3. Мы перехватываем перевызванное исключение во внешнем блоке try-except.

Когда вы выполните этот код, вы увидите:

Начало рискованной операции...
Поймали ошибку, логируем ее...
Операция не выполнена: Что-то пошло не так!

Итак, друзья! Мы покрыли вызов исключений, встроенные исключения, пользовательские исключения и даже перевызов исключений. Помните, исключения – это не ваши враги, это ценные инструменты, которые помогают вам писать надежный и устойчивый к ошибкам код.

Как я всегда говорю своим студентам, программирование – это как учиться ездить на велосипеде. Вы можете упасть несколько раз, но каждое падение (или исключение) учит вас чему-то новому. Постоянно практикуйтесь, будьте любознательными и не бойтесь вызывать несколько исключений на своем пути!

Счастливого кодинга, и пусть ваши исключения всегда будут намеренными! ?✨

Credits: Image by storyset