50 lines
1.9 KiB
Markdown
50 lines
1.9 KiB
Markdown
# Обработка ошибок
|
||
|
||
## Иерархия исключений
|
||
|
||
```python
|
||
# app/core/exceptions.py
|
||
AppError
|
||
├── AuthenticationError # 401 — неверный токен/пароль
|
||
├── ForbiddenError # 403 — нет прав
|
||
├── NotFoundError # 404 — ресурс не найден
|
||
├── ConflictError # 409 — дубликат, конфликт
|
||
├── ValidationError # 422 — неверные данные
|
||
└── ServiceUnavailableError # 503 — внешний сервис недоступен
|
||
```
|
||
|
||
## Матрица по слоям
|
||
|
||
| Слой | Что делаем | Пример |
|
||
|------|-----------|--------|
|
||
| **API** | HTTPException с detail и status_code | `raise HTTPException(404)` |
|
||
| **Services** | Бизнес-исключения (из AppError) | `raise NotFoundError("Idea", id)` |
|
||
| **Integrations** | try/except с fallback | `return AIResult(success=False)` |
|
||
| **Agents** | AgentResult(success=False, error=...) | Без HTTP-статусов |
|
||
| **Data/DB** | Ошибки не всплывают выше | Ловим в сервисе |
|
||
|
||
## Fallback pattern (AI провайдеры)
|
||
|
||
```python
|
||
# app/integrations/ai/fallback.py
|
||
# YandexGPT → GigaChat, 2 retry, 2s/5s backoff
|
||
# При недоступности всех — AgentResult(success=False, message=...)
|
||
```
|
||
|
||
## Graceful degradation
|
||
|
||
| Сервис недоступен | Реакция |
|
||
|-------------------|---------|
|
||
| PostgreSQL | 503 Service Unavailable |
|
||
| Redis | Работаем без Celery (прямой вызов), log WARNING |
|
||
| AI провайдер | Fallback на другой, потом Error |
|
||
| Celery | Выполняем задачу синхронно |
|
||
|
||
## Логирование ошибок
|
||
|
||
| Уровень | Когда |
|
||
|---------|-------|
|
||
| WARNING | Timeout, retry, fallback |
|
||
| ERROR | Ошибка внешнего API |
|
||
| CRITICAL | Исчерпаны все retry |
|