Какие исключения нужно обработать при конвертации типов в Python?
Что проверяют
Знаете ли вы, какие исключения реально бросают int(), float() и их соседи, и отличаете ли ошибку значения от ошибки типа. Хороший интервьюер проверяет и обратное: где конвертация не бросает ничего, но молча даёт неверный результат. Следом часто просят написать безопасный парсер ввода.
Как отвечать
Основные исключения и когда они возникают:
ValueError: тип подходит, значение нет.int("12.5"),int("abc"),float("1,5"),int(float("nan")), неверный формат вdatetime.strptime. Сюда жеjson.JSONDecodeErrorиUnicodeDecodeError, оба наследуютValueError;TypeError: неподходящий тип.int(None),int([1]),float({});OverflowError:int(float("inf"))иfloat(10**400), то есть переход между целым и дробным числом за пределы диапазона;decimal.InvalidOperation:Decimal("abc")при стандартном контексте;- лимит длины: в Python 3.11 (и в поздних патч-релизах старых веток) строка длиннее 4300 цифр в
int()даётValueError, лимит меняется черезsys.set_int_max_str_digits.
Практика: ловите конкретные исключения, обычно except (ValueError, TypeError), логируйте исходное значение и возвращайте понятную ошибку, а не None без объяснения. Для входных данных API удобнее Pydantic: он соберёт все ошибки в один ValidationError.
Обязательно назовите случаи без исключения. int(3.9) молча отбрасывает дробную часть и возвращает 3. bool("False") равно True, потому что непустая строка истинна. float("1e500") вернёт inf. int(" 42 ") и int("1_000") отработают успешно, это стоит учитывать при валидации.
Где спотыкаются
Пишут голый except: или except Exception. В первом случае глотается даже KeyboardInterrupt, во втором настоящие баги в соседнем коде.
Утверждают, что str(None) бросает TypeError. На деле возвращается строка "None", которая спокойно уезжает в базу.
Считают, что int(1e100) падает с переполнением. Целые в Python не ограничены, результат будет огромным числом, а OverflowError появится только на бесконечности или при обратном переводе слишком большого целого в float.