Обработка ошибок ввода и отсутствия файла
Содержание курса
В прошлом уроке мы разобрали базовую механику try-except: как обернуть опасный код, как указать конкретный тип исключения и почему голый except — плохая идея. Сейчас этот инструмент нужно применить к двум реальным сценариям — некорректный ввод пользователя и попытка открыть файл, которого не существует.
Контекст урока: try-except и базовые исключения
Прежде чем переходить к конкретным паттернам, важно понять, с какими исключениями будем работать в этом уроке.
Первое — ValueError. Оно возникает, когда вы пытаетесь преобразовать строку в число, а строка не содержит допустимого значения. Например, int('abc') или int('') — оба вызова завершатся ValueError. Это исключение вы уже видели раньше.
Второе — FileNotFoundError. Оно появляется в тот момент, когда Python выполняет open() в режиме чтения ('r'), а файл с указанным именем не существует на диске. Технически FileNotFoundError является подклассом OSError — общего класса для ошибок операционной системы. Это значит, что его можно перехватить и через except OSError:, но точнее и понятнее писать именно except FileNotFoundError:.
Почему open() бросает исключение? Потому что Python пытается обратиться к файловой системе, получает отказ от ОС и сигнализирует об этом через исключение. Никакой «тихой» обработки по умолчанию нет — если не перехватить FileNotFoundError, программа упадёт с трейсбэком.
Важно понимать: FileNotFoundError актуален прежде всего при открытии на чтение ('r'), когда файл обязан уже существовать. Если вы открываете файл на запись ('w') и директория существует, Python создаст файл сам — FileNotFoundError не возникнет. Поэтому в этом уроке фокус на режиме чтения.
Эти два исключения покрывают разные точки программы: ValueError — при обработке пользовательского ввода, FileNotFoundError — при работе с файловой системой. В обоих случаях инструмент одинаков: try-except с явным указанием типа.
