← Назад к вопросам

Какие знаешь конструкции у try except?

1.0 Junior🔥 61 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Конструкции Try-Except в Python

Полная поддержка обработки исключений — одна из ключевых особенностей Python. Рассмотрим все варианты.

1. Базовая конструкция try-except

try:
    result = 10 / 0  # Выбросит ZeroDivisionError
except ZeroDivisionError:
    print("Ошибка: деление на ноль")

Если в блоке try возникает исключение, выполнение прыгает в соответствующий except блок.

2. Множественные except блоки

try:
    # Опасный код
    data = json.loads(user_input)
    value = int(data["age"])
    result = 100 / value
except ValueError as e:
    print(f"Ошибка парсинга: {e}")
except ZeroDivisionError as e:
    print(f"Деление на ноль: {e}")
except json.JSONDecodeError as e:
    print(f"Невалидный JSON: {e}")

Важно: Порядок имеет значение! Специфичные исключения должны быть первыми.

3. Ловля нескольких исключений одновременно

try:
    data = fetch_user_data()
except (ValueError, KeyError, AttributeError) as e:
    print(f"Ошибка обработки данных: {e}")

Используй кортеж для группировки нескольких типов исключений.

4. Блок else

try:
    file = open("data.txt", "r")
except FileNotFoundError:
    print("Файл не найден")
else:
    content = file.read()
    print(f"Прочитано {len(content)} байт")
    file.close()

Блок else выполняется только если try завершился без ошибок. Полезно для кода, который зависит от успеха try.

5. Блок finally

try:
    connection = connect_to_database()
    execute_query(connection)
except ConnectionError:
    print("Ошибка подключения")
finally:
    if connection:
        connection.close()

Finally выполняется всегда — обязательно закрыть ресурс. Это включает случаи когда: было исключение, выполнен return в try/except или возникло новое исключение.

6. Полная конструкция try-except-else-finally

try:
    file = open("config.json", "r")
    config = json.load(file)
except FileNotFoundError:
    print("Конфигурация не найдена")
    config = {}
except json.JSONDecodeError:
    print("Невалидный JSON")
    config = {}
else:
    print(f"Загружено {len(config)} параметров")
finally:
    try:
        file.close()
    except NameError:
        pass

7. Получение информации об исключении

try:
    items = [1, 2, 3]
    item = items[10]
except IndexError as e:
    print(f"Тип: {type(e).__name__}")
    print(f"Сообщение: {str(e)}")
    print(f"Args: {e.args}")

8. Re-raising исключений

try:
    risky_operation()
except ValueError as e:
    logger.error(f"Ошибка обработки данных: {e}")
    raise  # Пробросить дальше вверх по стеку

Исключение распространяется к вызывающей функции, но мы логировали его.

9. Конвертирование исключений

try:
    result = int(user_input)
except ValueError as e:
    raise ValueError(f"Ожидается число, получено: {user_input}") from e

Вариант "from e" сохраняет оригинальное исключение в цепи, помогая отладке.

10. Context managers (with statement)

with open("data.txt", "r") as file:
    content = file.read()
# Файл автоматически закроется даже при исключении

Это более элегантный способ работы с ресурсами, чем try-finally.

11. Custom исключения

class InvalidUserAgeError(ValueError):
    def __init__(self, age):
        self.age = age
        super().__init__(f"Возраст {age} невалидный")

try:
    raise InvalidUserAgeError(999)
except InvalidUserAgeError as e:
    print(f"Ошибка: {e}")
    print(f"Возраст: {e.age}")

12. Assertы

def divide(a, b):
    assert b != 0, "Делитель не может быть нулём"
    return a / b

Assert выбрасывает AssertionError если условие False.

Best Practices

# Правильно — специфичный except с информацией
try:
    file = open("data.json", "r")
    data = json.load(file)
except FileNotFoundError:
    logger.error("Конфигурационный файл не найден")
    data = {}
except json.JSONDecodeError as e:
    logger.error(f"Невалидный JSON")
    data = {}
finally:
    try:
        file.close()
    except NameError:
        pass

Иерархия исключений

Самые распространённые:

  • Exception (базовый класс)
    • ValueError, TypeError, KeyError
    • FileNotFoundError, OSError
    • RuntimeError, NotImplementedError
    • ZeroDivisionError, IndexError
    • ImportError, AttributeError

Отладка

import traceback

try:
    risky_code()
except Exception as e:
    traceback.print_exc()
    error_text = traceback.format_exc()
    logger.error(error_text)

Обработка исключений в Python — это искусство нахождения баланса между надёжностью и гибкостью кода.

Какие знаешь конструкции у try except? | PrepBro