Перейти к основному содержимому
Модуль 2 · Урок 4 из 48/36 в курсе~12 min
Уроки модуля (4/4)

Обработка ошибок: попробовать/исключить

Если во время выполнения что-то идет не так (деление на ноль, отсутствующий ключ, операцию с несовместимыми типами) Python вызывает исключение. Без обработка, исключение прерывает программу. С try / except вы может поймать его и решить, что делать.

Основная форма

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • блок try: содержит код, который может дать сбой;
  • except <ErrorType>: выполняется только в том случае, если возникает ошибка этого типа. внутри try.

Перехват сообщения об исключении

Используйте as, чтобы привязать объект исключения к имени:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

Несколько типов вместе

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Кортеж типов перехватывает любые исключения этих типов (или подклассов).

Полная структура: попробуйте/кроме/еще/наконец.

Python
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 exception
  • else — используйте его для кода, успех которого зависит от try. Держи это отдельно, чтобы случайно не перехватить несвязанные исключения.
  • finally — очистка, которая должна происходить всегда (закрытие файла, освобождение ресурс). Выполняется как при успехе, так и при ошибке.

Вызов исключения: raise

Иногда именно вы хотите подать сигнал, что что-то пошло не так:

Python
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: выполняется всегда, независимо от того, возникло ли исключение. Это идеально подходит для очистки ресурсов (например, закрытия открытого файла или соединения с базой данных).

Попробуйте сами

Упражнение#python.m2.l4.e1
Попыток: 0Загрузка…

Напишите выражение, которое пытается int('abc'): если ValueError возникает, присвойте строку 'errore' значению `result`; в противном случае назначьте номер. Оцените «результат».

Загрузка редактора…
Показать подсказку

int('abc') вызывает ValueError.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m2.l4.e2
Попыток: 0Загрузка…

Определите `divide(a, b)`, который возвращает a/b, но выдает ValueError с сообщением "делитель нуля", если b равно 0. Затем вызовите divide(10, 0) внутри try/Exception и присвойте `message` строку перехваченного исключения.

Загрузка редактора…
Показать подсказку

поднять ValueError('...') внутри функции; поймать с исключением ValueError как e.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#python.m2.l4.e3
Попыток: 0Загрузка…

Напишите блок Try-Exception для преобразования строки text_val = "abc"\` в целое число. Если преобразование вызывает ошибку \`ValueError\`, присвойте \`None\` параметру \`result\`. В противном случае присвойте преобразованный номер. Наконец, оцените \`результат\`.

Загрузка редактора…
Показать подсказку

Используйте try: result = int(text_val), за которым следует, кроме ValueError: result = None.

Решение доступно после 3 попыток