refactor: Standardize error handling patterns across codebase
Comprehensive error handling improvements addressing inconsistent patterns: • Created markitect/exceptions.py with complete domain-specific exception hierarchy - MarkitectError base class with context and cause chaining support - Specific exceptions for Document, AST, Cache, Database, Schema operations - Built-in logging and context preservation • Fixed overly broad exception handling in tddai modules: - issue_fetcher.py: Replace generic Exception with specific Gitea errors - project_manager.py: Proper error translation with context preservation - coverage_analyzer.py: Replace silent suppression with logging • Enhanced cache_service.py error handling: - Specific OSError/PermissionError handling for file operations - Logging integration for unexpected errors - Preserved error collection and reporting • Implemented proper exception chaining patterns: - All error translations use `raise ... from e` for debugging - Preserved original exception context and stack traces - Added docstring declarations of raised exceptions • Benefits: - Eliminates silent error suppression and debugging black holes - Provides specific, actionable error messages - Preserves full error context for troubleshooting - Establishes consistent patterns for future development Resolves issue #21: Error handling standardization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ from typing import Dict, Any, List, Optional
|
||||
|
||||
from gitea import GiteaClient, GiteaConfig
|
||||
from gitea.models import ProjectState, Priority, Milestone as GiteaMilestone, Label as GiteaLabel
|
||||
from gitea.exceptions import GiteaError, GiteaNotFoundError, GiteaAuthError, GiteaApiError
|
||||
from .config import get_config
|
||||
from .exceptions import IssueError
|
||||
|
||||
@@ -32,7 +33,16 @@ class ProjectManager:
|
||||
self.gitea_client = GiteaClient(gitea_config)
|
||||
|
||||
def _make_api_call(self, method: str, url: str, data: Dict[str, Any] = None) -> Dict[str, Any]:
|
||||
"""Make authenticated API call to Gitea (kept for backwards compatibility)."""
|
||||
"""Make authenticated API call to Gitea (kept for backwards compatibility).
|
||||
|
||||
Args:
|
||||
method: HTTP method (GET, POST, etc.)
|
||||
url: API endpoint URL
|
||||
data: Optional request data
|
||||
|
||||
Raises:
|
||||
IssueError: When API call fails (with specific context)
|
||||
"""
|
||||
# This method is kept for backwards compatibility but now delegates to the gitea client
|
||||
# For new code, use the gitea_client directly
|
||||
try:
|
||||
@@ -45,8 +55,16 @@ class ProjectManager:
|
||||
return self._issue_to_dict(issue)
|
||||
else:
|
||||
raise IssueError(f"Legacy API call not supported: {method} {url}")
|
||||
except Exception as e:
|
||||
raise IssueError(f"API call failed: {e}")
|
||||
except GiteaNotFoundError as e:
|
||||
raise IssueError(f"Resource not found for {method} {url}") from e
|
||||
except GiteaAuthError as e:
|
||||
raise IssueError(f"Authentication failed for {method} {url}") from e
|
||||
except GiteaApiError as e:
|
||||
raise IssueError(f"API error for {method} {url}: {e}") from e
|
||||
except GiteaError as e:
|
||||
raise IssueError(f"Gitea error for {method} {url}: {e}") from e
|
||||
except (ValueError, IndexError) as e:
|
||||
raise IssueError(f"Invalid URL format for {method} {url}") from e
|
||||
|
||||
def _issue_to_dict(self, issue) -> Dict[str, Any]:
|
||||
"""Convert Issue object to dict for backwards compatibility."""
|
||||
|
||||
Reference in New Issue
Block a user