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
) и вовремя добавлять проверку стандартных ошибок. Остальное современные фреймворки сделают за вас.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ