Основы Python: Первые шаги в программировании
Обработка ошибок
Lesson 15 of 16 • 10 XP
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, вы будете писать программы, лучше подготовленные к реальному миру.