|
|
|
|
|
""" |
|
|
Core Exception Classes |
|
|
|
|
|
Centralized exception definitions for the application. |
|
|
This module provides clean exception classes without |
|
|
depending on UI or external frameworks. |
|
|
""" |
|
|
|
|
|
|
|
|
class AppException(Exception): |
|
|
"""Base exception class for application-specific errors""" |
|
|
|
|
|
def __init__(self, message: str, user_message: str = None, recovery_hint: str = None): |
|
|
self.message = message |
|
|
self.user_message = user_message or message |
|
|
self.recovery_hint = recovery_hint |
|
|
super().__init__(message) |
|
|
|
|
|
|
|
|
class ValidationError(AppException): |
|
|
"""Error for input validation failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class ProcessingError(AppException): |
|
|
"""Error for document processing failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class AIError(AppException): |
|
|
"""Error for AI service failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class ConfigError(AppException): |
|
|
"""Error for configuration issues""" |
|
|
pass |
|
|
|
|
|
|
|
|
class FileOperationError(AppException): |
|
|
"""Error for file operation failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class NetworkError(AppException): |
|
|
"""Error for network-related failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class LLMConnectionError(AIError): |
|
|
"""Error for LLM API connection failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class LLMAuthenticationError(AIError): |
|
|
"""Error for LLM API authentication failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class LLMTimeoutError(AIError): |
|
|
"""Error for LLM API timeout failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class LLMQuotaExceededError(AIError): |
|
|
"""Error for LLM API quota/rate limit exceeded""" |
|
|
pass |
|
|
|
|
|
|
|
|
class LLMInvalidResponseError(AIError): |
|
|
"""Error for invalid LLM API responses""" |
|
|
pass |
|
|
|
|
|
|
|
|
class DocumentProcessingError(ProcessingError): |
|
|
"""Error for document processing failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
class SearchError(AppException): |
|
|
"""Error for search operation failures""" |
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
def create_validation_error(message: str, recovery_hint: str = None) -> ValidationError: |
|
|
"""Create a validation error with consistent formatting""" |
|
|
return ValidationError( |
|
|
message, |
|
|
user_message=f"Validation error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your input and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_processing_error(message: str, recovery_hint: str = None) -> ProcessingError: |
|
|
"""Create a processing error with consistent formatting""" |
|
|
return ProcessingError( |
|
|
message, |
|
|
user_message=f"Processing error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your files and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_ai_error(message: str, recovery_hint: str = None) -> AIError: |
|
|
"""Create an AI error with consistent formatting""" |
|
|
return AIError( |
|
|
message, |
|
|
user_message=f"AI service error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your API key and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_config_error(message: str, recovery_hint: str = None) -> ConfigError: |
|
|
"""Create a configuration error with consistent formatting""" |
|
|
return ConfigError( |
|
|
message, |
|
|
user_message=f"Configuration error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your configuration and environment variables" |
|
|
) |
|
|
|
|
|
|
|
|
def create_file_error(message: str, recovery_hint: str = None) -> FileOperationError: |
|
|
"""Create a file operation error with consistent formatting""" |
|
|
return FileOperationError( |
|
|
message, |
|
|
user_message=f"File error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check file permissions and paths" |
|
|
) |
|
|
|
|
|
|
|
|
def create_network_error(message: str, recovery_hint: str = None) -> NetworkError: |
|
|
"""Create a network error with consistent formatting""" |
|
|
return NetworkError( |
|
|
message, |
|
|
user_message=f"Network error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your internet connection and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_llm_connection_error(message: str, recovery_hint: str = None) -> LLMConnectionError: |
|
|
"""Create an LLM connection error with consistent formatting""" |
|
|
return LLMConnectionError( |
|
|
message, |
|
|
user_message=f"AI service connection error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your internet connection and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_llm_authentication_error(message: str, recovery_hint: str = None) -> LLMAuthenticationError: |
|
|
"""Create an LLM authentication error with consistent formatting""" |
|
|
return LLMAuthenticationError( |
|
|
message, |
|
|
user_message=f"AI service authentication error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your API key and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_llm_timeout_error(message: str, recovery_hint: str = None) -> LLMTimeoutError: |
|
|
"""Create an LLM timeout error with consistent formatting""" |
|
|
return LLMTimeoutError( |
|
|
message, |
|
|
user_message=f"AI service timeout: {message}", |
|
|
recovery_hint=recovery_hint or "Please try again in a few moments" |
|
|
) |
|
|
|
|
|
|
|
|
def create_llm_quota_error(message: str, recovery_hint: str = None) -> LLMQuotaExceededError: |
|
|
"""Create an LLM quota exceeded error with consistent formatting""" |
|
|
return LLMQuotaExceededError( |
|
|
message, |
|
|
user_message=f"AI service quota exceeded: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your API usage limits and try again later" |
|
|
) |
|
|
|
|
|
|
|
|
def create_llm_invalid_response_error(message: str, recovery_hint: str = None) -> LLMInvalidResponseError: |
|
|
"""Create an LLM invalid response error with consistent formatting""" |
|
|
return LLMInvalidResponseError( |
|
|
message, |
|
|
user_message=f"AI service returned invalid response: {message}", |
|
|
recovery_hint=recovery_hint or "Please try again or contact support if the issue persists" |
|
|
) |
|
|
|
|
|
|
|
|
def create_document_processing_error(message: str, recovery_hint: str = None) -> DocumentProcessingError: |
|
|
"""Create a document processing error with consistent formatting""" |
|
|
return DocumentProcessingError( |
|
|
message, |
|
|
user_message=f"Document processing error: {message}", |
|
|
recovery_hint=recovery_hint or "Please check your document format and try again" |
|
|
) |
|
|
|
|
|
|
|
|
def create_search_error(message: str, recovery_hint: str = None) -> SearchError: |
|
|
"""Create a search error with consistent formatting""" |
|
|
return SearchError( |
|
|
message, |
|
|
user_message=f"Search error: {message}", |
|
|
recovery_hint=recovery_hint or "Please try adjusting your search terms" |
|
|
) |
|
|
|