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
Первая ошибка (отмеченная зелёным) — это исходная ошибка, которая возникла где-то глубоко внутри кода. Иногда такие ошибки возникают время от времени, и это нормальное поведение программы.
Вторая ошибка (отмеченная синим) — это уже более высокоуровневая ошибка. Ваша программа или фреймворк должны знать, как её обработать. А вот если вы хотите копнуть глубже и узнать причины возникновения ошибки, тут как раз зелёная ошибка вам в помощь.
Все сделано очень разумно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ