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

Как выполнить код, если не произошло исключений в блоке try?

1.2 Junior🔥 201 комментариев
#Python Core

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

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

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

Клаузула else в try-except

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

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

try:
    # Код, который может выбросить исключение
    risky_operation()
except SomeException:
    # Код, если произошло исключение
    handle_error()
else:
    # Код выполнится ТОЛЬКО если в try не было исключений
    print("Успешно, исключений не было")

Практические примеры

Пример 1: Парсинг JSON

import json

def parse_json_safely(json_string):
    try:
        data = json.loads(json_string)
    except json.JSONDecodeError as e:
        print(f"Ошибка парсинга JSON: {e}")
        return None
    else:
        # Выполнится только если JSON распарсился успешно
        print(f"JSON успешно распарсен: {data}")
        return data

parse_json_safely('{"name": "John"}')
# Выведет: JSON успешно распарсен

parse_json_safe('{invalid json}')
# Выведет: Ошибка парсинга JSON

Пример 2: Работа с файлами

def read_file_safely(filename):
    try:
        with open(filename, 'r') as f:
            content = f.read()
    except FileNotFoundError:
        print(f"Файл {filename} не найден")
    except IOError:
        print("Ошибка при чтении файла")
    else:
        # Код выполнится только если файл успешно открыт и прочитан
        print(f"Файл успешно прочитан, размер: {len(content)} байт")
        return content

Пример 3: Асинхронные операции в FastAPI

from fastapi import FastAPI, HTTPException
import httpx

app = FastAPI()

@app.get("/fetch-data")
async def fetch_external_data(url: str):
    try:
        async with httpx.AsyncClient() as client:
            response = await client.get(url, timeout=5.0)
            response.raise_for_status()
    except httpx.TimeoutException:
        raise HTTPException(status_code=504, detail="Request timeout")
    except httpx.HTTPError as e:
        raise HTTPException(status_code=502, detail=f"External service error: {e}")
    else:
        # Выполнится только если запрос успешен
        print("Данные получены успешно")
        return response.json()

Пример 4: Валидация данных

def validate_user_email(email: str) -> bool:
    try:
        # Проверяем формат email
        if '@' not in email or '.' not in email:
            raise ValueError("Invalid email format")
    except ValueError as e:
        print(f"Ошибка валидации: {e}")
        return False
    else:
        # Код выполнится только если валидация прошла успешно
        print(f"Email {email} валиден")
        return True

Комбинация с finally

Можно использовать все три клаузулы одновременно:

def process_data(data_source):
    try:
        data = fetch_data(data_source)
    except ConnectionError:
        print("Ошибка подключения")
    else:
        # Если данные получены успешно
        print(f"Получено {len(data)} записей")
        process_records(data)
    finally:
        # Выполнится В ЛЮБОМ СЛУЧАЕ
        cleanup_resources()
        print("Очистка ресурсов завершена")

Когда использовать else

  • Разделение логики: когда успешный путь отличается от обработки ошибок
  • Читаемость: делает код более понятным (явно видно, что это код для успешного сценария)
  • Производительность: else-блок НЕ выполнится, если было исключение
  • Часто используется при:
    • Чтении файлов
    • Парсинге данных
    • Работе с внешними API
    • Валидации входных данных

Важные моменты

  • else выполняется ТОЛЬКО если нет исключений в try блоке
  • Исключения в else-блоке не ловятся except-блоком — их нужно обрабатывать отдельно
  • finally выполняется ВСЕГДА — и при исключениях, и в else блоке, и когда исключений нет

Это стандартный и очень полезный паттерн обработки ошибок в Python.