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:
2025-09-26 16:35:13 +02:00
parent 7f5309c4b0
commit bbc6192fe1
7 changed files with 420 additions and 18 deletions

View File

@@ -246,8 +246,21 @@ class CoverageAnalyzer:
coverage_keywords=coverage_keywords,
related_issue=related_issue
))
except (OSError, IOError, UnicodeDecodeError) as e:
# Skip files that can't be read due to file system or encoding issues
# Log the issue but continue processing other files
import logging
logging.getLogger(__name__).warning(
f"Could not read test file {test_file}: {e}"
)
continue
except Exception as e:
# Skip files that can't be read
# Unexpected errors should be logged but not silently ignored
import logging
logging.getLogger(__name__).error(
f"Unexpected error processing test file {test_file}: {e}",
exc_info=True
)
continue
return existing_tests