tc-agent / utils /error_handler.py
togitoon's picture
Initial
bf5f290
from typing import Dict, Any, Optional
from fastapi import HTTPException
import logging
logger = logging.getLogger(__name__)
class StandardAPIResponse:
"""Standardized API response format"""
@staticmethod
def success(data: Any, message: str = "Operation successful", metadata: Optional[Dict] = None) -> Dict:
"""Create a successful response"""
response = {
"success": True,
"data": data,
"message": message
}
if metadata:
response["metadata"] = metadata
return response
@staticmethod
def error(error_message: str, status_code: int = 500, error_code: Optional[str] = None) -> Dict:
"""Create an error response"""
response = {
"success": False,
"error": error_message,
"status_code": status_code
}
if error_code:
response["error_code"] = error_code
return response
def handle_service_error(error: Exception, operation: str, user_context: Optional[str] = None) -> Dict:
"""
Standardized error handling for service operations
Args:
error: The exception that occurred
operation: Description of the operation that failed
user_context: Additional context (e.g., user email)
Returns:
Standardized error response dictionary
"""
error_msg = str(error)
context_info = f" for {user_context}" if user_context else ""
# Log the error
logger.error(f"Error in {operation}{context_info}: {error_msg}")
# Handle specific error types
if isinstance(error, HTTPException):
return StandardAPIResponse.error(
error_message=error.detail,
status_code=error.status_code
)
elif isinstance(error, ValueError):
return StandardAPIResponse.error(
error_message=f"Invalid input for {operation}: {error_msg}",
status_code=400,
error_code="INVALID_INPUT"
)
elif isinstance(error, ConnectionError):
return StandardAPIResponse.error(
error_message=f"Connection error during {operation}: {error_msg}",
status_code=503,
error_code="CONNECTION_ERROR"
)
else:
return StandardAPIResponse.error(
error_message=f"Unexpected error in {operation}: {error_msg}",
status_code=500,
error_code="INTERNAL_ERROR"
)
def create_http_exception(error_response: Dict) -> HTTPException:
"""Convert standardized error response to HTTPException"""
return HTTPException(
status_code=error_response.get("status_code", 500),
detail=error_response.get("error", "Internal server error")
)