Модульні уроки (4/4)
Обробка помилок: try/except
Коли щось йде не так під час виконання (ділення на нуль, відсутній ключ, an
операція з несумісними типами) Python створює виняток. без
обробка, виняток перериває програму. З try / except ви
може зловити це і вирішити, що робити.
Основна форма
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- блок
try:містить код, який може вийти з ладу; except <ErrorType>:виконується лише якщо виникає помилка цього типу всерединіtry.
Перехоплення повідомлення про винятки
Використовуйте as, щоб прив’язати об’єкт винятку до імені:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Кілька типів разом
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneКортеж типів ловить будь-які винятки цих типів (або підкласів).
Повна структура: try/except/else/finally
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— використовуйте його для коду, який залежить від успіхуtry. Залиште це розділити, щоб випадково не перехопити непов’язані винятки.finally— очищення, яке повинно відбуватися завжди (закриття файлу, звільнення ресурс). Виконується як в разі успіху, так і в разі помилки.
Створення винятку: raise
Іноді саме ви хочете повідомити, що щось пішло не так:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bНайпоширеніші вбудовані винятки, з якими ви зіткнетеся:
ValueError— значення має правильний тип, але є неприйнятним (наприклад, аналіз).TypeError— тип неправильний (наприклад,len(42)).KeyError/IndexError— відсутній ключ/індекс.ZeroDivisionError— ділення на нуль.FileNotFoundError,PermissionError— операції з файловою системою.
Речення else і finally у блоках try
Блок try може визначати два додаткових положення:
else: виконується, лише якщо блокtryзавершується без виклику будь-яких винятків.finally: виконується завжди, незалежно від того, чи сталася виняткова ситуація. Це ідеально підходить для очищення ресурсів (наприклад, закриття відкритого файлу або підключення до бази даних).
Спробуйте самі
Напишіть вираз, який намагається int('abc'): якщо виникає ValueError, призначте рядок 'errore' до `result`; інакше призначити номер. Оцініть `результат`.
Показати підказку
int('abc') викликає ValueError.
Рішення доступне після 3 спроб
Повторна вправа
Визначте `divide(a, b)`, який повертає a/b, але викликає ValueError із повідомленням 'divisore zero', якщо b дорівнює 0. Потім викличте divide(10, 0) усередині try/except і призначте `message` рядок перехопленого винятку.
Показати підказку
підняти ValueError('...') всередині функції; catch з крім ValueError як e.
Рішення доступне після 3 спроб
Додатковий виклик
Напишіть блок \`try-except\`, щоб перетворити рядок \`text_val = "abc"\` на ціле число. Якщо перетворення викликає \`ValueError\`, призначте \`None\` для \`result\`. В іншому випадку призначте перетворений номер. Нарешті, оцініть \`результат\`.
Показати підказку
Використовуйте try: result = int(text_val), а потім крім ValueError: result = None.
Рішення доступне після 3 спроб