/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/src/testgen/core/exceptions.py
145 строк
5 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
""" Полная иерархия исключений приложения. """ from typing import Any class AppError(Exception): """Базовое исключение приложения.""" def __init__( self, message: str, code: str = "internal_error", status_code: int = 500, details: dict[str, Any] | None = None, ): self.message = message self.code = code self.status_code = status_code self.details = details or {} super().__init__(message) def to_dict(self) -> dict: return { "error": { "code": self.code, "message": self.message, "details": self.details, } } class EntityNotFoundError(AppError): def __init__(self, entity_type: str, entity_id: str | None = None): message = f"{entity_type} не найден(а)" if entity_id: message += f" (id: {entity_id})" super().__init__(message=message, code="entity_not_found", status_code=404) self.entity_type = entity_type self.entity_id = entity_id class EntityAlreadyExistsError(AppError): def __init__(self, entity_type: str, field: str, value: str): super().__init__( message=f"{entity_type} с {field}='{value}' уже существует", code="entity_already_exists", status_code=409, ) self.entity_type = entity_type self.field = field self.value = value class AuthenticationError(AppError): def __init__(self, message: str = "Недействительные учётные данные"): super().__init__(message=message, code="authentication_error", status_code=401) class PermissionDeniedError(AppError): def __init__(self, message: str = "Недостаточно прав"): super().__init__(message=message, code="permission_denied", status_code=403) class TokenExpiredError(AppError): def __init__(self, token_type: str = "access"): super().__init__( message=f"{token_type}-токен истёк", code="token_expired", status_code=401, ) class TokenInvalidError(AppError): def __init__(self): super().__init__( message="Недействительный токен", code="token_invalid", status_code=401 ) class ValidationError(AppError): def __init__(self, message: str, details: dict | None = None): super().__init__( message=message, code="validation_error", status_code=422, details=details ) class InvalidStateTransitionError(AppError): def __init__(self, entity_type: str, from_status: str, to_status: str): super().__init__( message=f"Недопустимый переход {entity_type} из '{from_status}' в '{to_status}'", code="invalid_state_transition", status_code=422, ) class GenerationError(AppError): def __init__(self, message: str, step: str | None = None): super().__init__(message=message, code="generation_error", status_code=500) self.step = step class LLMResponseValidationError(GenerationError): def __init__(self, message: str): super().__init__( message=f"Некорректный ответ от модели: {message}", step="validation" ) class LLMProviderError(AppError): def __init__(self, message: str, provider: str, model: str): super().__init__(message=message, code="llm_provider_error", status_code=502) self.provider = provider self.model = model class RateLimitError(AppError): def __init__(self, retry_after: int = 60): super().__init__( message=f"Слишком много запросов. Повторите через {retry_after} секунд", code="rate_limit_exceeded", status_code=429, ) self.retry_after = retry_after class CircuitBreakerOpenError(AppError): def __init__(self, provider: str): super().__init__( message=f"Сервис {provider} временно недоступен", code="circuit_breaker_open", status_code=503, ) self.provider = provider class DatabaseError(AppError): def __init__(self, message: str): super().__init__(message=message, code="database_error", status_code=500) class InternalError(AppError): def __init__(self, message: str = "Внутренняя ошибка сервера"): super().__init__(message=message, code="internal_error", status_code=500)