6.1 Намірений запуск виключень
В Python ти можеш навмисно запускати виключення, використовуючи оператор raise. Це дає можливість сигналізувати про виникнення помилки або неправильної ситуації у твоїй програмі. Давай розглянемо різні способи використання оператора raise і переупакування виключень.
Запуск стандартних виключень
Загальний синтаксис такої операції має вигляд:
raise виключення
Ти можеш запускати стандартні виключення, такі як Exception, TypeError і інші, передаючи їм відповідні повідомлення.
Приклад: raise Exception
def check_number(value):
if value < 0:
raise Exception("Вибач, числа менше нуля не дозволені")
try:
check_number(-5)
except Exception as e:
print(f"Виключення спіймане: {e}")
У цьому прикладі, якщо значення менше нуля, запускається Exception з повідомленням "Вибач, числа менше нуля не дозволені".
Приклад: raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("Дозволені тільки цілі числа")
try:
check_integer("string")
except TypeError as e:
print(f"Виключення спіймане: {e}")
У цьому прикладі, якщо значення не є цілим числом, запускається TypeError з повідомленням "Дозволені тільки цілі числа".
6.2 Переупакування виключення
Іноді потрібно перехопити одне виключення і запустити інше, надаючи більш специфічну або корисну інформацію. Це можна зробити за допомогою оператора raise ... from, який зберігає вихідне виключення як причину для нового.
Загальний синтаксис такої операції має вигляд:
raise нове_виключення from старе_виключення
Приклад: Переупакування виключення
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("Змінна порожня")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Порожня змінна виявлена") from e
У цьому прикладі, якщо значення змінної порожнє, спочатку запускається ValueError з повідомленням "Змінна порожня". Це виключення потім перехоплюється, і запускається нове виключення EmptyVariableError з повідомленням "Порожня змінна виявлена", при цьому вихідне виключення передається з допомогою from.
6.3 Аналіз переупакованих виключень
Використання оператора raise ... from дозволяє зберегти інформацію про ланцюжок виключень, що може бути корисно для налагодження. Ти можеш аналізувати переупаковані виключення і їх причини.
Приклад аналізу переупакованих виключень:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("Змінна порожня")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Порожня змінна виявлена") 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
Перша помилка (відмічена зеленим) — це вихідна помилка, яка виникла десь глибоко в коді. Іноді такі помилки виникають час від часу, і це нормальна поведінка програми.
Друга помилка (відмічена синім) — це вже більш високорівнева помилка. Твоя програма або фреймворк повинні знати, як її обробляти. А от якщо ти хочеш заглибитися і дізнатися причини виникнення помилки, тут якраз зелена помилка буде тобі на допомогу.
Все зроблено дуже розумно.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ