# app/modules/monitoring/exceptions.py """ Monitoring module exceptions. This module provides exception classes for monitoring operations including: - Background task tracking - Capacity snapshot management - Code quality/architecture scans """ from app.exceptions.base import ( BusinessLogicException, ExternalServiceException, ResourceNotFoundException, ValidationException, ) __all__ = [ # Task exceptions "TaskNotFoundException", # Capacity exceptions "CapacitySnapshotNotFoundException", # General monitoring exceptions "MonitoringServiceException", # Code quality exceptions "ViolationNotFoundException", "ScanNotFoundException", "ScanExecutionException", "ScanTimeoutException", "ScanParseException", "ViolationOperationException", "InvalidViolationStatusException", ] # ============================================================================= # Task Exceptions # ============================================================================= class TaskNotFoundException(ResourceNotFoundException): # noqa: MOD025 """Raised when a background task is not found.""" def __init__(self, task_id: str): super().__init__( resource_type="BackgroundTask", identifier=task_id, error_code="TASK_NOT_FOUND", ) # ============================================================================= # Capacity Exceptions # ============================================================================= class CapacitySnapshotNotFoundException(ResourceNotFoundException): # noqa: MOD025 """Raised when a capacity snapshot is not found.""" def __init__(self, snapshot_id: int): super().__init__( resource_type="CapacitySnapshot", identifier=str(snapshot_id), error_code="CAPACITY_SNAPSHOT_NOT_FOUND", ) # ============================================================================= # General Monitoring Exceptions # ============================================================================= class MonitoringServiceException(BusinessLogicException): # noqa: MOD025 """Raised when a monitoring operation fails.""" def __init__(self, operation: str, reason: str): super().__init__( message=f"Monitoring operation '{operation}' failed: {reason}", error_code="MONITORING_OPERATION_FAILED", details={"operation": operation, "reason": reason}, ) # ============================================================================= # Code Quality Exceptions # ============================================================================= class ViolationNotFoundException(ResourceNotFoundException): """Raised when a violation is not found.""" def __init__(self, violation_id: int): super().__init__( resource_type="Violation", identifier=str(violation_id), error_code="VIOLATION_NOT_FOUND", ) class ScanNotFoundException(ResourceNotFoundException): """Raised when a scan is not found.""" def __init__(self, scan_id: int): super().__init__( resource_type="Scan", identifier=str(scan_id), error_code="SCAN_NOT_FOUND", ) class ScanExecutionException(ExternalServiceException): # noqa: MOD025 """Raised when architecture scan execution fails.""" def __init__(self, reason: str): super().__init__( service_name="ArchitectureValidator", message=f"Scan execution failed: {reason}", error_code="SCAN_EXECUTION_FAILED", ) class ScanTimeoutException(ExternalServiceException): """Raised when architecture scan times out.""" def __init__(self, timeout_seconds: int = 300): super().__init__( service_name="ArchitectureValidator", message=f"Scan timed out after {timeout_seconds} seconds", error_code="SCAN_TIMEOUT", details={"timeout_seconds": timeout_seconds}, ) class ScanParseException(BusinessLogicException): """Raised when scan results cannot be parsed.""" def __init__(self, reason: str): super().__init__( message=f"Failed to parse scan results: {reason}", error_code="SCAN_PARSE_FAILED", details={"reason": reason}, ) class ViolationOperationException(BusinessLogicException): # noqa: MOD025 """Raised when a violation operation fails.""" def __init__(self, operation: str, violation_id: int, reason: str): super().__init__( message=f"Failed to {operation} violation {violation_id}: {reason}", error_code="VIOLATION_OPERATION_FAILED", details={ "operation": operation, "violation_id": violation_id, "reason": reason, }, ) class InvalidViolationStatusException(ValidationException): # noqa: MOD025 """Raised when a violation status transition is invalid.""" def __init__(self, violation_id: int, current_status: str, target_status: str): super().__init__( message=f"Cannot change violation {violation_id} from '{current_status}' to '{target_status}'", field="status", details={ "violation_id": violation_id, "current_status": current_status, "target_status": target_status, }, ) self.error_code = "INVALID_VIOLATION_STATUS"