Обработка исключений с помощью try/except в Python

19 июня 2026
Автор

Антон Ларичев

Введение

В процессе выполнения программы неизбежно возникают ситуации, которые программист не предусмотрел заранее: пользователь ввёл строку вместо числа, файл оказался недоступен, ключ отсутствует в словаре. Для таких случаев в Python предусмотрен механизм исключений (exceptions) — специальных объектов, сигнализирующих о возникновении ошибки во время работы программы.

Конструкция try/except позволяет перехватывать исключения и реагировать на них корректно, не допуская аварийного завершения программы. В этой статье разберём, что такое исключения, как они возникают, и как грамотно их обрабатывать.

Что такое исключения и почему они возникают

Исключение — это объект в Python, который создаётся интерпретатором (или вашим кодом) в момент, когда выполнение программы встречает ситуацию, с которой не может справиться в штатном режиме.

Причины возникновения исключений можно разделить на несколько групп:

  • Ошибки типов данных — попытка сложить строку с числом, передать неверный тип аргумента
  • Ошибки доступа — обращение к несуществующему ключу словаря или индексу за пределами списка
  • Ошибки ввода/вывода — файл не найден, нет прав на чтение
  • Арифметические ошибки — деление на ноль
  • Ошибки преобразования — невозможно превратить строку в число

Когда исключение возникает и не перехватывается, Python завершает программу и выводит трейсбек (traceback) — цепочку вызовов, приведших к ошибке. Например:

# Попытка преобразовать нечисловую строку в целое число
number = int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'

Задача try/except — перехватить это исключение до того, как оно «убьёт» программу.

Базовый синтаксис try/except

Конструкция состоит из двух обязательных частей:

try:
    # Блок кода, который может вызвать исключение
    result = 10 / 0
except:
    # Блок кода, который выполняется при возникновении исключения
    print("Что-то пошло не так")

Логика работы следующая:

  1. Интерпретатор выполняет код в блоке try
  2. Если исключение не возникло — блок except пропускается
  3. Если исключение возникло — управление немедленно передаётся в блок except

Дополнительно к try/except существуют ещё два необязательных блока:

try:
    result = int(input("Введите число: "))
except ValueError:
    print("Это не число!")
else:
    # Выполняется только если исключения не было
    print(f"Вы ввели: {result}")
finally:
    # Выполняется всегда — и при ошибке, и без неё
    print("Блок finally всегда выполняется")
  • else — выполняется только при отсутствии исключения
  • finally — выполняется в любом случае, удобен для освобождения ресурсов (закрытие файлов, соединений)

Перехват конкретных типов исключений

Голый except без указания типа перехватывает абсолютно все исключения — это плохая практика (подробнее ниже). Правильный подход — указывать конкретный тип исключения.

ValueError

Возникает, когда операция получает аргумент правильного типа, но неподходящего значения:

user_input = "не число"

try:
    number = int(user_input)  # Попытка преобразовать строку в int
except ValueError:
    print("Ошибка: введите корректное целое число")

TypeError

Возникает при операции с объектами несовместимых типов:

try:
    result = "10" + 5  # Нельзя складывать строку и число напрямую
except TypeError:
    print("Ошибка: несовместимые типы данных")

KeyError

Возникает при обращении к несуществующему ключу словаря:

user = {"name": "Алексей", "age": 25}

try:
    email = user["email"]  # Ключ "email" отсутствует в словаре
except KeyError:
    print("Ошибка: ключ не найден в словаре")
    email = None  # Устанавливаем значение по умолчанию

IndexError

Возникает при обращении к индексу за пределами последовательности:

numbers = [1, 2, 3]

try:
    value = numbers[10]  # Индекс 10 не существует в списке из 3 элементов
except IndexError:
    print("Ошибка: индекс выходит за пределы списка")

ZeroDivisionError

Возникает при попытке делить на ноль:

def safe_divide(a, b):
    try:
        return a / b  # Потенциальное деление на ноль
    except ZeroDivisionError:
        print("Ошибка: деление на ноль")
        return None

FileNotFoundError

Возникает при попытке открыть несуществующий файл:

try:
    with open("data.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Файл не найден. Создаём новый...")
    content = ""

Если вы хотите детальнее изучить основы Python и научиться уверенно обрабатывать ошибки в реальных программах — приходите на наш большой курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажёры для практики 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Несколько блоков except

Одному блоку try можно сопоставить несколько блоков except — для обработки разных типов ошибок по-разному:

def parse_and_divide(data, index, divisor):
    try:
        value = data[index]       # Может вызвать IndexError
        result = int(value)       # Может вызвать ValueError
        return result / divisor   # Может вызвать ZeroDivisionError
    except IndexError:
        print(f"Ошибка: индекс {index} выходит за границы списка")
    except ValueError:
        print(f"Ошибка: значение '{value}' нельзя преобразовать в число")
    except ZeroDivisionError:
        print("Ошибка: делитель равен нулю")
    return None

Python проверяет блоки except последовательно сверху вниз и выполняет первый подходящий. После этого остальные блоки except пропускаются.

Несколько типов исключений можно также объединить в одном блоке, передав их как кортеж:

try:
    value = int(input("Введите число: "))
    result = 100 / value
except (ValueError, ZeroDivisionError):
    # Обрабатываем оба случая одинаково
    print("Некорректный ввод: введите ненулевое целое число")

Ключевое слово as — доступ к деталям исключения

Ключевое слово as позволяет получить объект исключения и изучить его атрибуты — в первую очередь сообщение об ошибке:

try:
    number = int("abc")
except ValueError as error:
    # error — это объект исключения с информацией об ошибке
    print(f"Тип ошибки: {type(error).__name__}")  # ValueError
    print(f"Сообщение: {error}")                   # invalid literal for int() with base 10: 'abc'

Это особенно полезно при логировании:

import logging

def load_config(path):
    try:
        with open(path) as file:
            return file.read()
    except FileNotFoundError as error:
        # Записываем подробности ошибки в лог
        logging.error(f"Не удалось загрузить конфигурацию: {error}")
        return None

Объект исключения хранит:

  • args — кортеж аргументов, переданных при создании исключения
  • строковое представление (через str()) — текстовое сообщение об ошибке
  • у некоторых исключений есть специфические атрибуты (например, errno у OSError)

Голый except и почему это плохая практика

Голый except (bare except) — это блок except без указания типа исключения:

try:
    result = risky_operation()
except:  # Перехватывает АБСОЛЮТНО ВСЁ — это плохо
    print("Что-то пошло не так")

Почему это проблема:

  • Перехватывает системные исключения вроде KeyboardInterrupt (Ctrl+C) и SystemExit — программу невозможно будет остановить штатным образом
  • Скрывает реальную причину ошибки — вы не знаете, что именно сломалось
  • Затрудняет отладку — ошибки «исчезают» без следа
  • Нарушает принцип явного указания намерений

Правильная альтернатива — перехватывать Exception, который захватывает все «обычные» исключения, но не системные:

try:
    result = risky_operation()
except Exception as error:
    # Exception не перехватывает KeyboardInterrupt и SystemExit
    print(f"Произошла ошибка: {error}")
    logging.exception("Необработанное исключение")

Ещё лучше — всегда указывать конкретные типы исключений, которые вы ожидаете.

Полный практический пример

Ниже — реалистичный пример функции для чтения данных из файла с комплексной обработкой ошибок:

def read_user_data(filepath, user_id):
    """
    Читает данные пользователя из файла.
    Возвращает словарь с данными или None при ошибке.
    """
    try:
        # Открываем файл для чтения
        with open(filepath, "r", encoding="utf-8") as file:
            import json
            data = json.load(file)         # Парсим JSON

        users = data["users"]              # Получаем список пользователей
        user = users[user_id]              # Берём пользователя по индексу
        age = int(user["age"])             # Преобразуем возраст в число

        return user

    except FileNotFoundError:
        print(f"Файл '{filepath}' не найден")
    except json.JSONDecodeError as error:
        print(f"Ошибка парсинга JSON: {error}")
    except KeyError as error:
        print(f"Ключ {error} отсутствует в данных")
    except IndexError:
        print(f"Пользователь с индексом {user_id} не существует")
    except ValueError as error:
        print(f"Некорректное значение: {error}")
    finally:
        # Этот блок выполнится всегда — удобно для логирования
        print("Попытка чтения завершена")

    return None

Частые ошибки

  • Использование голого except вместо конкретных типов исключений — скрывает реальные проблемы и затрудняет отладку
  • Перехват исключения без какой-либо реакции — «проглатывание» ошибок делает поведение программы непредсказуемым
  • Слишком широкий блок try — чем меньше кода в try, тем точнее понятно, где именно возникает ошибка
  • Использование исключений для управления потоком вместо условий if/else — исключения должны обрабатывать исключительные, а не штатные ситуации
  • Потеря трейсбека при перехвате — при повторном возбуждении исключения используйте raise без аргументов, а не raise error заново

Частозадаваемые вопросы

Чем отличается except Exception от голого except? except Exception перехватывает все «обычные» исключения, унаследованные от класса Exception, но не трогает BaseException-наследников вроде KeyboardInterrupt, SystemExit и GeneratorExit. Голый except перехватывает буквально всё, включая системные сигналы — это почти всегда нежелательно.

Можно ли использовать try/except внутри цикла? Да, и это распространённый паттерн. Например, при обработке списка данных можно перехватывать ошибки на каждой итерации, продолжая цикл вместо его прерывания:

results = []
for item in raw_data:
    try:
        results.append(int(item))  # Пробуем преобразовать каждый элемент
    except ValueError:
        results.append(None)       # При ошибке ставим None и продолжаем

Как повторно выбросить исключение после его обработки? Используйте raise без аргументов внутри блока except — это пробросит оригинальное исключение с сохранением трейсбека:

try:
    risky_operation()
except ValueError as error:
    logging.error(f"Поймали ValueError: {error}")
    raise  # Пробрасываем исключение дальше

Что такое цепочка исключений? Python позволяет связывать исключения через raise NewException(...) from original_error. Это удобно при создании собственных исключений — сохраняется контекст исходной ошибки.

Когда использовать finally? Блок finally нужен для кода, который должен выполниться в любом случае — освобождение ресурсов, закрытие соединений, запись в лог. Хотя менеджеры контекста (with) обычно решают эту задачу элегантнее.

Заключение

Механизм try/except — один из фундаментальных инструментов написания надёжного Python-кода. Ключевые принципы: всегда указывайте конкретные типы исключений, используйте as для получения деталей ошибки, не «проглатывайте» исключения молча, а для обязательного кода завершения применяйте finally.

Для закрепления навыков обработки исключений и других основ Python рекомендуем курс Основы Python. В первых 3 модулях курса доступно бесплатное содержание, что позволяет познакомиться с материалом, попрактиковаться на реальных задачах и понять структуру курса до покупки полного доступа.

Стрелочка влевоУдаление данных в Python с помощью removeФункция super() в Python — как вызвать метод родителяСтрелочка вправо

Постройте личный план изучения Python до уровня Middle — бесплатно!

Python — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Python

Как отправлять запросы с помощью requests в PythonПочему Python выводит значение без команды printКак работает команда print в PythonВозможности Python для автоматизации задачРабота с JSON в Python на примерахPython get — методы получения данныхКак находить и исправлять ошибки в PythonРабота с данными через API и внешние сервисыСтруктура и оформление кода PythonОсновы Django с PythonПолезные приёмы в Python для повседневной работыИспользование locals в Python для отладкиИнтеграция PHP и PythonКак выполнять HTTPS-запросы в PythonFastAPI Python — быстрый старт: создание REST API с нуляКак работать с API в Python
Ввод целого числа в PythonВедение логов в PythonУдаление данных в Python с помощью removeОбработка исключений с помощью try/except в PythonФункция super() в Python — как вызвать метод родителяСоздание собственных контекстных менеджеров в PythonРабота с символами программирования PythonРабота с переменной X в PythonРабота с классами в PythonКак скачать Python на компьютерПростая программа на Python для начинающихОсновы Python для тех, кто начинаетЧто нового в Python 3Поддерживается ли Python 2 и стоит ли его использоватьPython 1 — с чего начиналась история языкаКоманда python print - полное руководство по выводу данныхПравила именования переменных в PythonПользовательские исключения в PythonОсновы Python coreОписание объектов PythonНаследование классов в Python — основы и примерыМножественное наследование в Python — примеры и MROКонтекстный менеджер with в Python — как работает и зачем нуженКомментарии в Python — однострочные, многострочные и docstringКакой Python выбрать для установкиКак вывести целое число с помощью print в PythonКак установить Python на Windows macOS и LinuxКак пользоваться консолью PythonКак получить последний элемент в PythonКак найти значение в PythonКак настроить PythonКак использовать print для строк в PythonКак работает интерпретатор PythonИнструкция по работе с PythonБлок finally в обработке исключений PythonЦелые числа в PythonАбстрактные классы в Python — ABC и abstractmethod
Загрузка данных PythonУправление проектами на GitHub с PythonСоздание веб-приложений на Flask PythonСоздание бота на PythonСоздание интерфейсов Python QTСоздание игр с PygameСоздание GUI в PythonКак работать со словарями в PythonРабота с библиотеками через Python PackagingРабота со временем в Python при помощи модуля timePython name — особенности переменнойМатематические операции в Python с модулем mathPython listing — что это и как использоватьPytest — тестирование на Python: полное руководствоОбработка изображений с OpenCV PythonNumPy в Python — основы и применение в задачахМашинное обучение с PythonИспользование Anaconda с PythonМодуль contextlib в Python — утилиты для контекстных менеджеровБиблиотеки Python и их применение в проектах
Возврат значений из функции в PythonВложенные функции в PythonСоздание собственных декораторов в PythonРабота с функцией map в PythonЦикл while в Python и примеры использованияОбработка чисел, введённых через input в PythonОсновные операторы в Python с примерамиУсловные выражения if else в Python для начинающихКак выполняется вызов функций call в PythonПродвинутые генераторы в Python — send, throw, close и корутиныПозиционные и именованные аргументы в PythonОбъявление переменных и управление областью видимости в PythonПередача аргументов по ссылке и по значению в PythonПередача аргументов через args и kwargs в PythonОсновные методы Python и примеры их использованияОператор match/case в Python 3.10+ — основы структурного сопоставленияПаттерны match/case в Python — деструктуризация, guard и вложенные шаблоныПрактические примеры match/case в Python — реальные сценарии примененияЛокальные и глобальные переменные в PythonЧасто используемые команды PythonКлючевые слова global и nonlocal в PythonКак создавать функции в PythonКак работает сборщик мусора в PythonКак работает область видимости переменных в PythonКак работает функция callable в PythonКак работает функция any и all в PythonКак проверить тип переменной в PythonКак передать функцию как аргумент в PythonКак использовать функцию isinstance в PythonКак использовать функцию filter в PythonКак использовать функцию filter в PythonКак использовать функцию eval безопасно в PythonКак использовать декораторы в PythonИзменяемые и неизменяемые типы данных в PythonГенераторы и yield в Python — как создавать и использоватьГенераторные выражения в Python — синтаксис и примерыФункции в Python и способы их вызоваФункции как объекты в PythonЧто такое замыкания в PythonЧто делает функция reduce в PythonЧто делает функция id в PythonАргументы по умолчанию в PythonАнонимные функции и lambda в PythonАлгоритмы на Python — примеры и объяснение
Запись данных в PythonУстановка pip в PythonУправление зависимостями requirement в PythonУправление библиотеками с помощью Python PackagingУдаление пробелов с помощью strip в PythonСтруктурирование кода в PythonСоздание исполняемого файла Python в exeРазбор traceback в модуле PythonРазбор site-packages в PythonРазбор Program Files в PythonРабота с Unicode кодировками в PythonРабота с системными функциями Python sysРабота с папкой AppData в PythonРабота с модулем logging в PythonРабота с каталогами в PythonРабота с CSV в PythonВиртуальная среда venv в Python — создание и настройкаКак создать простое приложение на PythonИспользование pip в Python для установки пакетовМодули в Python и организация кода в проектеИмпорт модулей в Python и правила подключенияРабота с файлами в Python пошаговоЧто делает компилятор Python и как он работаетПолучение строки из модуля PythonПодключение файлов в Python с includeПеременные среды в PythonСборка проекта с помощью packaging в PythonНастройка Python сервераИспользование Python на UbuntuИспользование консоли PythonИспользование кодировок в PythonИнициализация пакетов PythonИмпорт модулей PythonИмпорт имен в PythonСреда IDLE Python и базовые возможностиЧтение и запись TXT в PythonЧтение файлов в Python с помощью open file
Удаление элементов из списка PythonТипы данных в Python — обзор и рекомендацииОсновные операции со строками в PythonМетоды str в Python и обработка текстаСписки в Python и их ключевые методыСоздание списков данных в PythonРабота со строками и символами в PythonРабота со столбцами в PythonРабота со списком значений в PythonРабота с таблицами в Python с помощью DataFrameРабота с RFR в PythonРабота с пробелами в PythonРабота с массивами в PythonРабота с кортежами tuple PythonРабота с координатами X и Y в PythonРабота с ключами в PythonРабота с элементами данных PythonРабота с двоичными числами PythonРабота с данными в PythonРабота с данными NumPy PythonРабота с большими числами в PythonРабота с битами в PythonРабота с байтами в PythonЧто такое значение в Python и как его определитьМножества в Python и операции с нимиИспользование range в Python для цикловПроверка на четность в PythonПроверка числа в PythonПреобразование типов в PythonПреобразование списка в строку PythonПреобразование числа в строку в PythonПостроение графиков в PythonОпределение индекса элемента в PythonОкругление чисел в PythonОбъединение списков в Python с помощью zipМножества в PythonМассивы в Python и отличие от списковМассив чисел в PythonКортежи данных в PythonКак вычислить сумму чисел в PythonКак получить остаток от деления в PythonКак найти следующее число в PythonИспользование Unicode в PythonТип int в Python и его особенностиИндекс списка в PythonФункции для работы со строками в PythonЭлементы Python и способы доступа к нимДоступ к элементам массива в PythonДеление чисел в PythonРабота с данными в Python на практикеКак работать с числами в Python
Открыть базу знаний

Лучшие курсы по теме

Иконка молнииНовый
изображение курса

Основы Python

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажерыAI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий