JavaRush /Курсы /Модуль 1: Python Core /Запуск исключения

Запуск исключения

Модуль 1: Python Core
10 уровень , 5 лекция
Открыта

6.1 Намеренный запуск исключений

В Python вы можете намеренно запускать исключения, используя оператор raise. Это позволяет вам сигнализировать о возникновении ошибки или неправильной ситуации в вашей программе. Давайте рассмотрим различные способы использования оператора raise и переупаковки исключений.

Запуск стандартных исключений

Общий синтаксис такой операции имеет вид:


raise исключение

Вы можете запускать стандартные исключения, такие как Exception, TypeError и другие, передавая им соответствующие сообщения.

Пример: raise Exception


def check_number(value):
    if value < 0:
        raise Exception("Sorry, no numbers below zero")
        
try:
    check_number(-5)
except Exception as e:
    print(f"Исключение поймано: {e}")

В этом примере, если значение меньше нуля, запускается Exception с сообщением "Sorry, no numbers below zero".

Пример: raise TypeError


def check_integer(value):
    if not isinstance(value, int):
        raise TypeError("Only integers are allowed")
        
try:
    check_integer("string")
except TypeError as e:
    print(f"Исключение поймано: {e}")

В этом примере, если значение не является целым числом, запускается TypeError с сообщением "Only integers are allowed".

6.2 Переупаковка исключения

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

Общий синтаксис такой операции имеет вид:


raise новое_исключение from старое_исключение

Пример: Переупаковка исключения


class EmptyVariableError(Exception):
    pass
        
def check_non_empty(value):
    if value == "":
        raise ValueError("The variable is empty")
        
try:
    check_non_empty("")
except ValueError as e:
    raise EmptyVariableError("Empty variable detected") from e

В этом примере, если значение переменной пустое, сначала запускается ValueError с сообщением "The variable is empty". Это исключение затем перехватывается, и запускается новое исключение EmptyVariableError с сообщением "Empty variable detected", при этом исходное исключение передается с помощью from.

6.3 Анализ переупакованных исключений

Использование оператора raise ... from позволяет сохранить информацию о цепочке исключений, что может быть полезно для отладки. Вы можете анализировать переупакованные исключения и их причины.

Пример анализа переупакованных исключений:


class EmptyVariableError(Exception):
    pass
        
def check_non_empty(value):
    if value == "":
        raise ValueError("The variable is empty")
        
try:
    check_non_empty("")
except ValueError as e:
    raise EmptyVariableError("Empty variable detected") from e

Запуск вышеуказанного кода приведет к следующему выводу:


Traceback (most recent call last): File "example.py", line 8, in 
   
     check_non_empty("") File "example.py", line 5, in check_non_empty raise ValueError("The variable is empty") ValueError: The variable is empty 
   
          
The above exception was the direct cause of the following exception:
          
Traceback (most recent call last): File "example.py", line 10, in 
   
     raise EmptyVariableError("Empty variable detected") from e EmptyVariableError: Empty variable detected 
   

Первая ошибка (отмеченная зелёным) — это исходная ошибка, которая возникла где-то глубоко внутри кода. Иногда такие ошибки возникают время от времени, и это нормальное поведение программы.

Вторая ошибка (отмеченная синим) — это уже более высокоуровневая ошибка. Ваша программа или фреймворк должны знать, как её обработать. А вот если вы хотите копнуть глубже и узнать причины возникновения ошибки, тут как раз зелёная ошибка вам в помощь.

Все сделано очень разумно.

2
Задача
Модуль 1: Python Core, 10 уровень, 5 лекция
Недоступна
Запуск стандартного исключения
Запуск стандартного исключения
2
Задача
Модуль 1: Python Core, 10 уровень, 5 лекция
Недоступна
Переупаковка исключения
Переупаковка исключения
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дима Белый Уровень 23
9 ноября 2025
Вообще давно уже можно привыкнуть , что задачи включают в себя материал, который дается ччуть позже, видимо, для того, чтоб ты мог в самообучение, гугл и прочее Но подбешивает)
AlterAyrol Уровень 25
24 октября 2025
Во второй задаче один и тот же код вызывает разные(!) ошибки в валидаторе на сайте и в pycharm. Код из лекции не прокатывает в обоих случаях) Необходимость в такой реализации в жизни...ну может на каком-то всратом собеседовании и пригодится что бы блеснуть обилием бесполезных знаний, а вот по факту.... и
6 августа 2025
А лучше сначала прочитать все темы раздела и потом по всем темам выполнять задачи
6 августа 2025
я уже понял, что можно читать следующую лекция и выполнять задачи предыдущей
SWK Уровень 26
8 апреля 2025

Все сделано очень разумно.
Допускаю. Но, рискну утверждать, авторам не удалось донести разумность подобной схемы до 90% студентов, включая меня. С другой стороны очевидно, что совсем новичков подобная заумь только отпугивает. Возможно, это и есть истинная цель авторов курса. Особенно доставляет второй пример.

try:
    raise что-то
except <это самое что-то>:
Это, безусловно - вершина читабельности, соблюдения кодов и здравого смысла. Программируйте так, дорогие ученики, и компания обязательно пошлёт вас в Индию. В один конец.
Александр Уровень 19 Expert
7 апреля 2025
вот признайтесь честно, хоть кто-нибудь решил сам вторую задачу ? написал сам вот эту часть кода:

    def __init__(self, message, original_exception):
        super().__init__(message)
        self.original_exception = original_exception
в описании класса ? это же опять только в следующей лекции объясняется... не понимаю зачем так делать. просто ставить учеников в тупик...
SWK Уровень 26
8 апреля 2025
Я решил. Вот этого вот:

    def __init__(self, message, original_exception):
        super().__init__(message)
        self.original_exception = original_exception
в описание класса писать не нужно. Достаточно скопировать логику приведённого в лекции примера. Понимать, зачем это - не обязательно. Класс исключения описывается ровно так же, как в примере, т.е.:

class InputValidationError(Exception):
    pass
А смысл этого самого примера в комбинации с текстом задачи приблизительно такой: 1. В готовом коде задачи программа запускает validate_input("") после чего ловит "самопальное" пользовательское исключение. 2. В примере переупаковки программа запускает процедуру, которая выбрасывает стандартное исключение, перехватывает его и выбрасывает пользовательское.
Александр Уровень 19 Expert
8 апреля 2025
О, спасибо за ответ, значит я не совсем дурак ))) я тоже сначала попытался сделать как в лекции. Но такой вариант не пропустил валидатор. и это правильно, ведь откуда возьмется атрибут объекта self.original_exception, который потом используется в уже данном коде задачи. Так что я до сих пор не понимаю как можно было решить задачу на данном в лекции материале. Я привык уже что даваемый материал максимально сух, и каждый пример нужно разбирать с нейросетью, но тут другой случай - в задаче предполагается использование механизма, про который не говорилось в лекции ! Поэтому я и удивляюсь, неужели кто-то нашел это решение сам ?
SWK Уровень 26
9 апреля 2025
original_exception, конечно, показался мне подозрительным на предмет того, что у оригинального Exception такого нет, но я решил посмотреть, что проверялка по этому поводу напишет. Оказалось, что проверялке это поле не требуется. В принципе, если бы проверялка написала, что требуется original_exception, теория, позволяющая его впендюрить в класс уже студентам выдана. Можно было и догадаться. Это у них манера подачи материала такая - считают возможным часть новой информации поместить в образец решения. Подход, конечно, не очевидный - кто-то сам сделает и пример не посмотрит.
Mr.Robot Уровень 21 Expert
14 марта 2025
Опять без позитива... Ну ладно.. 14.03.2025
Максим Уровень 15
23 января 2025
Вторую задачу я прошёл, но второй принт в примере использования очень сбивает. У меня так и не получилось вывести текст оригинального исключения, но и без него проверку отлично проходит.
Андрей Уровень 15
28 сентября 2024
По второй задаче полезно почитать следующую лекцию. Там как раз про создание пользовательских исключений.