Коды ошибок Python
Коды ошибок Python представляют собой исключения, возникающие при выполнении некорректных или недопустимых операций в программе. Понимание этих ошибок крайне важно для разработки стабильных и надежных систем, так как позволяет быстро находить источник сбоев, исправлять ошибки и внедрять эффективные решения. Ошибки могут возникать во время разработки при нарушении синтаксиса, использовании неверных типов данных, обращении к несуществующим ресурсам или некорректной логике программы. Ключевые концепции включают синтаксис, типы исключений, методы отладки и обработку ошибок. Этот справочник предоставляет полный перечень наиболее распространенных ошибок Python, описывает условия их возникновения, демонстрирует практические примеры и лучшие методы обработки. Читатель научится выявлять, перехватывать и исправлять ошибки, а также применять продвинутые стратегии отладки, повышающие надежность и устойчивость бэкенд-приложений.
Рассмотрим практический пример: система, которая обрабатывает пользовательский ввод, считывает файлы и подключается к базе данных. В таких случаях могут возникать ошибки, такие как FileNotFoundError
, ValueError
или ZeroDivisionError
. Для обеспечения надежности критические операции помещаются в блоки try
, а каждое исключение обрабатывается в соответствующих блоках except
. Это позволяет корректно реагировать на каждую ошибку, вести логирование и применять альтернативные решения. Блок finally
гарантирует освобождение ресурсов, таких как файлы или соединения с базой данных, даже при возникновении ошибок. Такой подход предотвращает неожиданные сбои, повышает сопровождаемость кода и обеспечивает стабильную работу бэкенд-систем в производственной среде.
Example
pythondef process_data():
try:
# NameError: использование несуществующей переменной
print(неопределенная_переменная)
# ZeroDivisionError: деление на ноль
результат = 10 / 0
# ValueError: некорректное преобразование
число = int("abc")
# FileNotFoundError: файл не найден
with open("не_существующий_файл.txt", "r") as f:
содержимое = f.read()
# AttributeError: вызов несуществующего метода
[].appendx(1)
except NameError as ne:
print(f"Перехвачено NameError: {ne}")
except ZeroDivisionError as zde:
print(f"Перехвачено ZeroDivisionError: {zde}")
except ValueError as ve:
print(f"Перехвачено ValueError: {ve}")
except FileNotFoundError as fe:
print(f"Перехвачено FileNotFoundError: {fe}")
except AttributeError as ae:
print(f"Перехвачено AttributeError: {ae}")
except Exception as e:
print(f"Перехвачено другое исключение: {e}")
finally:
print("Очистка ресурсов завершена.")
process_data()
📊 Comprehensive Reference
Error | Описание | Когда возникает | Пример | Примечания |
---|---|---|---|---|
SyntaxError | Синтаксическая ошибка | Неверный код | eval('x === 2') |
Происходит на этапе компиляции |
IndentationError | Ошибка отступов | Неправильная индентация | if True:\nprint("Привет") |
Подтип SyntaxError |
TabError | Смешение табуляции и пробелов | Использование табов и пробелов вместе | <tab> <space> print("Привет") |
Необходим единообразный отступ |
NameError | Неопределённая переменная | Использование несуществующей переменной | print(x) |
Частая ошибка при отладке |
TypeError | Неверный тип | Операция с несоответствующим типом | 5 + "5" |
Python динамически типизирован |
ValueError | Неверное значение | Некорректное преобразование или значение | int("abc") |
Проверка входных данных |
IndexError | Индекс вне диапазона | Доступ к несуществующему индексу | lst = []; lst[1] |
Проверка длины списка |
KeyError | Ключ отсутствует | Доступ к несуществующему ключу словаря | d = {}; d['x'] |
Использовать dict.get() для безопасности |
AttributeError | Отсутствие атрибута | Вызов несуществующего метода | [].appendx(1) |
Проверка имени метода |
ZeroDivisionError | Деление на ноль | Делитель равен нулю | 10 / 0 |
Проверка делителя |
ImportError | Модуль не найден | Отсутствие модуля | import модуль_не_существует |
Проверка установки |
ModuleNotFoundError | Модуль не найден | Отсутствие модуля | import не_существует |
Python 3.6+ |
FileNotFoundError | Файл не найден | Отсутствие файла | open("не_существует.txt") |
Проверка пути |
IsADirectoryError | Ожидался файл, получен каталог | Открытие каталога | open("папка") |
Зависит от ОС |
NotADirectoryError | Ожидался каталог, получен файл | os.listdir("файл.txt") |
Зависит от ОС | |
PermissionError | Недостаточно прав | Отказ в доступе | open("/root/file") |
Проверка прав |
OSError | Ошибка системы | Проблема с ОС | os.remove("/root/file") |
Базовый класс для других ошибок |
OverflowError | Переполнение | Слишком большое значение | 2.0**10000 |
Редко в Python 3 |
RecursionError | Слишком глубокая рекурсия | Много рекурсивных вызовов | def f(): f(); f() |
sys.setrecursionlimit() |
MemoryError | Недостаток памяти | Очень большие данные | a = 'a'*10**10 |
Зависит от системы |
StopIteration | Итератор завершен | Пустой итератор | next(iter([])) |
Пользовательские итераторы |
AssertionError | Сбой assert | assert False |
Проверка условий | |
FloatingPointError | Ошибка с плавающей точкой | Некорректная операция FP | numpy.seterr(all='raise') |
NumPy |
UnicodeError | Ошибка кодировки/декодирования | "ü".encode("ascii") |
Проверка encoding | |
UnicodeDecodeError | Ошибка декодирования | b'\xff'.decode('utf-8') |
Чтение файла | |
UnicodeEncodeError | Ошибка кодирования | "ü".encode("ascii") |
Неверная кодировка | |
RecursionWarning | Предупреждение рекурсии | Глубокая рекурсия | import warnings |
Не фатально |
DeprecationWarning | Предупреждение устаревшей функции | Использование устаревшей функции | warnings.warn("deprecated") |
Следует мигрировать |
RuntimeWarning | Предупреждение времени выполнения | Потенциальная проблема | import warnings |
Не фатально |
FutureWarning | Предупреждение будущих изменений | Изменения в будущих версиях | warnings.warn("future") |
Проверка совместимости |
UserWarning | Пользовательское предупреждение | Кастомное предупреждение | warnings.warn("user") |
Не фатально |
PendingDeprecationWarning | Скорое устаревание | Функция будет удалена | warnings.warn("pending") |
Редко |
ResourceWarning | Неосвобожденный ресурс | Файл не закрыт | open("file") |
Python 3+ |
ArithmeticError | Арифметическая ошибка | Некорректная операция | int("x")/0 |
Базовый класс |
BufferError | Ошибка буфера | Некорректная операция буфера | memoryview(b'').release() |
Редко |
ConnectionError | Ошибка соединения | Сетевые проблемы | requests.get("bad_url") |
Зависит от сети |
BrokenPipeError | Разрыв канала | Запись в закрытый pipe | os.write(fd, b'data') |
Unix |
ChildProcessError | Ошибка дочернего процесса | Проблема с дочерним процессом | os.waitpid(-1) |
Редко |
EOFError | Неожиданный конец файла | Конец ввода | input() EOF |
Пустой ввод |
EnvironmentError | Ошибка среды | Проблема ОС/окружения | os.remove("/root/file") |
Базовый класс OSError |
GeneratorExit | Выход генератора | gen.close() |
Генераторы | |
IOError | Ошибка ввода/вывода | Сбой чтения/записи | open("/root/file") |
Python 3 -> OSError |
InterruptedError | Прервано | Прерывание системного вызова | os.read(fd, 0) |
Unix |
LookupError | Ошибка поиска | Неверный поиск | d['x'] |
Базовый класс Lookup |
ReferenceError | Недействительная ссылка | Weak ref истекла | import weakref |
Редко |
RuntimeError | Ошибка времени выполнения | raise RuntimeError() |
Общая ошибка | |
StopAsyncIteration | Конец async итератора | async for |
Python 3.5+ | |
SyntaxWarning | Предупреждение синтаксиса | Подозрительный синтаксис | warnings.warn("syntax") |
Не останавливает программу |
SystemError | Системная ошибка | Внутренняя ошибка Python | sys._getframe(0) |
Редко |
SystemExit | Выход из системы | sys.exit() |
Завершает программу | |
TimeoutError | Истекло время | Тайм-аут операции | socket.settimeout() |
Сеть |
UnboundLocalError | Неинициализированная локальная переменная | Использование до присваивания | x=1; def f(): print(x); x=2 |
Подтип NameError |
ZeroDivisionError | Деление на ноль | Делитель равен нулю | 10 / 0 |
Проверка делителя |
🧠 Проверьте Свои Знания
Test Your Knowledge
Проверьте свои знания кодов ошибок Python
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху