← Назад к вопросам
Как выполнить код, если не произошло исключений в блоке 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.