JavaRush /Курсы /Модуль 1: Python Core /Обработка исключений

Обработка исключений

Модуль 1: Python Core
10 уровень , 2 лекция
Открыта

3.1 Захват исключений

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

В Python для захвата и обработки исключений используются конструкции try, except, else и finally. Эти конструкции позволяют перехватывать ошибки, возникающие во время выполнения программы, и предпринимать соответствующие действия.

Конструкция try-except

Конструкция try-except используется для захвата и обработки исключений. Блок try содержит код, который может вызвать исключение, а блок except содержит код, который будет выполнен в случае возникновения исключения.

Пример:


try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: деление на ноль.")

Если в коде внутри блока try возникнет исключение ZeroDivisionError, то оно будет захвачено блоком except и выполнится код с вызовом print().

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

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


try:
    result = int("abc")
except ZeroDivisionError:
    print("Ошибка: деление на ноль.")
except ValueError:
    print("Ошибка: некорректное значение.")

Перехват всех исключений

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


try:
    result = 10 / 0
except:
    print("Произошла ошибка.")

3.2 Операторы else и finally

Кроме операторов try и except, есть еще два опциональных: else и finally. Сейчас я расскажу о них немного подробнее.

Конструкция try-except-else

Блок else используется для выполнения кода, если в блоке try не возникло исключений.


try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка: деление на ноль.")
else:
    print(f"Результат: {result}")

Конструкция try-except-finally

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


try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: деление на ноль.")
finally:
    print("Этот блок выполняется всегда.")

Полный пример: try-except-else-finally

Пример:


try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка: деление на ноль.")
else:
    print(f"Результат: {result}")
finally:
    print("Этот блок выполняется всегда.")

3.3 Пример try-except-else-finally

Давайте разберем какой-нибудь большой реальный пример. Например, мы пытаемся прочитать данные из файла на диске — что может быть проще?


file = open("file.txt", "r")
content = file.read()
print(content)

Что может пойти не так? Например, всё:

  • Файл может отсутствовать. Его могли случайно удалить, не записать, или ваша программа вообще выполняется на другом компьютере, где его отродясь не было.
  • Ошибка чтения файла. У вашей программы нет к нему доступа, т.к. он находится в директории, к которой нужны админские права.
  • Другая программа сейчас пишет в этот файл и читать его нельзя — у нее монопольный доступ к файлу.

Вам мало? Тогда не забудьте, что независимо от того, на каком шаге произошла ошибка при работе с файлом, вам обязательно нужно его «закрыть», чтобы операционная система освободила ресурсы, выделенные для работы с этим файлом.

Так что реальный код будет выглядеть примерно так:


try:
    file = open("non_existent_file.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("Ошибка: файл не найден.")
except IOError:
    print("Ошибка: ошибка ввода-вывода.")
else:
    print(content)
finally:
    if 'file' in locals() and not file.closed:
        file.close()
        print("Файл закрыт.")

Добро пожаловать в реальный мир, где вам нужно написать код не только для «рабочего сценария», но и для всех возможных сценариев, которые могут пойти не так.

Ладно, не буду вас запугивать — это проще, чем кажется. Нужно просто понимать, что такое граничные условия (corner cases) и вовремя добавлять проверку стандартных ошибок. Остальное современные фреймворки сделают за вас.

2
Задача
Модуль 1: Python Core, 10 уровень, 2 лекция
Недоступна
Обработка исключений.
Обработка исключений.
2
Задача
Модуль 1: Python Core, 10 уровень, 2 лекция
Недоступна
Преобразование данных.
Преобразование данных.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Andrey Bobrovski Уровень 64
8 февраля 2025
зачем нужен finally? в чем проблема просто дописать то, что нам нужно всегда, ПОСЛЕ блока try-except
13 февраля 2025
Про блок finally сказали в конце статьи - он чаще всего нужен для закрытия ресурсов. А вот для блока else твой вопрос вполне подходит!
SWK Уровень 25
8 апреля 2025
Вкуриваем вот это предложение из лекции:

Блок finally содержит код, который будет выполнен 
независимо от того, возникло исключение или нет
Ключевое слово - "независимо". То, что ты напишешь "после блока try-except" не выполнится, если ошибка возникнет, но не отработается блоками except. Управление будет передано наверх по стеку вызовов и всё, что написано после try-finally не выполнится. А если ошибка не отрабатывается в текущем блоке, но есть finally, сначала выполнится то, что в finally, а потом уже управление передастся в вызывающую процедуру.
TrAvA Уровень 32
19 января 2025
Ctrl + Alt + T в PyCharm позволяет обернуть текущую строку в if, while, try/except или try/finally
Алексей Уровень 25
9 января 2025
почему в этой строке

if 'file' in locals() and not file.closed
'file' в кавычках?
Igor Уровень 40
11 января 2025
locals() отдаёт словарь, ключи в нём это переменные, они там строки

a = 123
b = "abc"
print(locals())
а просто if file выдаст NameError при отсутствии переменно и будет новое исключение, а не False
Assator Уровень 23
13 февраля 2025
а как может отсутствовать переменная file в данном случае? Мы же ее объявили и до объявления программа дойдет же в любом случае...
SWK Уровень 25
8 апреля 2025
Сначала файл открывается, потом записывается в переменную file. Не откроется - возникнет исключение - выполнение блока try прекратится - оператор присвоения не выполнится - переменная file не образуется. Потому как отдельного оператора объявления нет, он совмещён с присвоением. Объявлять-то в языке без строгой типизации нечего. Это не точно, но где-то 146%+-...