Уроки модуля (4/4)
Обработка ошибок: попробовать/исключить
Если во время выполнения что-то идет не так (деление на ноль, отсутствующий ключ,
операцию с несовместимыми типами) 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:
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 с сообщением "делитель нуля", если b равно 0. Затем вызовите divide(10, 0) внутри try/Exception и присвойте `message` строку перехваченного исключения.
Показать подсказку
поднять ValueError('...') внутри функции; поймать с исключением ValueError как e.
Решение доступно после 3 попыток
Дополнительная задача
Напишите блок Try-Exception для преобразования строки text_val = "abc"\` в целое число. Если преобразование вызывает ошибку \`ValueError\`, присвойте \`None\` параметру \`result\`. В противном случае присвойте преобразованный номер. Наконец, оцените \`результат\`.
Показать подсказку
Используйте try: result = int(text_val), за которым следует, кроме ValueError: result = None.
Решение доступно после 3 попыток