Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Ошибки неизбежны в любой программе, и Python предлагает несколько способов для работы с ними.
Обработка ошибок крайне важна, чтобы ваша программа могла продолжать работу безопасно и эффективно, даже когда происходит что-то неожиданное.

В этом уроке мы рассмотрим разные типы ошибок, как их обрабатывать, как вызывать собственные ошибки и как гарантировать, что важные задачи очистки всегда выполняются.


Типы ошибок в Python

Прежде чем учиться обрабатывать ошибки, нужно понять две основные категории:

  • Синтаксические ошибки: происходят, когда код Python синтаксически неверен. Их ловит интерпретатор Python до запуска программы.
    Пример: забыть двоеточие после оператора if.

  • Исключения: происходят во время выполнения программы, когда случается что-то неожиданное — например, деление на ноль или обращение к несуществующему индексу списка.

Обработка исключений с помощью try и except

Самый распространённый способ обработки исключений в Python — использовать блоки try/except:

  • В блоке try находится код, который может вызвать исключение.
  • В блоке except — код, который выполнится, если исключение возникнет.

Пример:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
except IOError:
    print("Не удалось открыть файл.")

Здесь:

  • Если файл "file.txt" не существует или его нельзя открыть, Python вызовет исключение IOError.
  • Блок except поймает это исключение и выведет дружелюбное сообщение вместо аварийного завершения.
СОВЕТ: Делайте блок try минимальным — включайте только код, который может не сработать, не весь связанный логический код.

Обработка нескольких типов исключений

Можно обрабатывать разные типы исключений отдельно, используя несколько блоков except:

try:
    # код, который может вызвать исключения
except TypeError:
    # обработка ошибок типа
except ValueError:
    # обработка ошибок значения
except:
    # обработка всех прочих исключений

Последний пустой except ловит любые неотловленные исключения — но используйте его осторожно, так как он может скрыть непредвиденные ошибки.

Генерация собственных исключений

Иногда вашей программе нужно сигнализировать о том, что что-то пошло не так — даже если Python не считает это ошибкой. Вы можете вызывать исключения с помощью оператора raise.

Пример:

def divide(a, b):
    if b == 0:
        raise ValueError("Второй аргумент не может быть нулём")
    return a / b

print(divide(10, 2))  # 5.0
print(divide(10, 0))  # ValueError: Второй аргумент не может быть нулём

Это позволяет задать чёткие сообщения об ошибке и остановить выполнение при неверных данных.

Блок finally

Блок finally содержит код, который всегда выполняется — вне зависимости от того, произошло исключение или нет. Обычно используется для освобождения ресурсов, таких как файлы или соединения с базой данных.

Пример:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
finally:
    file.close()

Даже если во время чтения файла возникла ошибка, блок finally гарантирует закрытие файла.

ВАЖНО!: Всегда закрывайте файлы и освобождайте ресурсы в блоке finally (или используйте оператор "with"), чтобы избежать утечек.


Поняли — вот дополнительный раздел, который вы можете добавить в урок Обработка ошибок, объясняющий, почему "ловить все подряд" через try/except — плохая практика и когда лучше использовать целенаправленную обработку исключений.


Избегайте ловить все исключения без причины

Распространённая ошибка новичков — оборачивать большие участки кода в один try/except, который ловит всё подряд — или, что ещё хуже, использовать просто пустой except: без указания типа ошибки.

Пример плохой практики:

try:
    # много не связанных друг с другом строк кода
except:
    pass  # игнорирует все ошибки молча

Почему это опасно:

  • Скрывает ошибки: настоящие баги в коде игнорируются, их сложнее найти.
  • Маскирует причину: теряется информация о том, что именно вызвало сбой.
  • Может вызывать непредсказуемое поведение: программа продолжит работу в некорректном состоянии.

Когда использовать широкую обработку исключений

Ловить все исключения (except Exception:) следует крайне редко и осознанно. Возможные ситуации:

  • Верхнеуровневое логирование ошибок в программе, чтобы не дать ей упасть и записать ошибку в лог.
  • Защитные циклы в сервисах, которые должны продолжать работу (но при этом логируют/сообщают об ошибке).
  • Временная отладка, чтобы быстро понять, что вообще что-то идёт не так — но только как кратковременный инструмент.

Лучшие практики

  • Будьте конкретны: ловите только те исключения, которые ожидаете и умеете обрабатывать.
  • Делайте блоки try небольшими: оборачивайте только потенциально падающий код, а не целые функции.
  • Всегда логируйте или обрабатывайте исключение осмысленно — не просто "pass" и забудьте о нём.

Такой избирательный подход облегчает отладку, делает код безопаснее и более предсказуемым.


Заключение

Обработка ошибок — это фундаментальная часть программирования на Python:

  • Она предотвращает неожиданные сбои.
  • Позволяет аккуратно справляться с проблемами.
  • Делает ваш код более надёжным, устойчивым и безопасным.

Овладев обработкой исключений, генерацией собственных ошибок и использованием finally, вы будете писать программы, лучше подготовленные к реальному миру.