-
Notifications
You must be signed in to change notification settings - Fork 0
auto-claude: 027-replace-51-bare-except-exception-catches-with-spec #84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
maynetee
merged 15 commits into
main
from
auto-claude/027-replace-51-bare-except-exception-catches-with-spec
Feb 3, 2026
Merged
auto-claude: 027-replace-51-bare-except-exception-catches-with-spec #84
maynetee
merged 15 commits into
main
from
auto-claude/027-replace-51-bare-except-exception-catches-with-spec
Feb 3, 2026
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…m_translator.py with specific types - Added imports: OpenAIError, RedisError, SQLAlchemyError - Redis operations (2): now catch RedisError specifically - SQLAlchemy operations (2): now catch SQLAlchemyError specifically - LLM translation operations (2): now catch (OpenAIError, httpx.HTTPError, Exception) - Google Translate fallback: kept Exception (appropriate for deep_translator library) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…anslation_service.py with specific types - Added import for SQLAlchemyError from sqlalchemy.exc - Replaced except Exception with except SQLAlchemyError in should_channel_translate() - Replaced except Exception with except SQLAlchemyError in translate_message_immediate() - Both functions primarily perform database operations, making SQLAlchemyError the appropriate specific exception type Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…e_service.py with RedisError - Imported RedisError from redis.exceptions - Replaced all 5 'except Exception' catches with 'except RedisError' - Updated corresponding tests to use RedisError instead of generic Exception - All 21 cache service tests now pass Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…ail_serv Replaced generic 'except Exception' catches with specific exception types: 1. TemplateRenderer.render() - now catches jinja2.TemplateError 2. SMTPProvider.send() - now catches (smtplib.SMTPException, OSError) 3. ResendProvider.send() - now catches (httpx.HTTPError, httpx.RequestError, httpx.TimeoutException) All 12 email service tests pass successfully. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…ates.py, usage.py, publisher.py Replace broad 'except Exception' clauses with specific exception types: - telegram_updates.py: Use RPCError, FloodWaitError, ChannelPrivateError, SQLAlchemyError, and RedisError - usage.py: Use SQLAlchemyError for database operations - publisher.py: Use RedisError for Redis publish operations This improves error handling specificity and follows the pattern established in telegram_setup.py Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…py, auth_rate_limiter.py, channel_join_queue.py, events.py - auth_rate_limiter.py: Replace Exception with RedisError for Redis operations - events.py: Replace Exception with RedisError for Redis publish operations - fetch_queue.py: Replace Exception with specific types (RedisError, SQLAlchemyError, RuntimeError, ValueError, KeyError, AttributeError) - channel_join_queue.py: Replace Exception with specific types for queue processing All changes follow the pattern from cache_service.py using specific exception types instead of generic Exception catches. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…i/channels.py with specific exceptions - Added SQLAlchemyError and IntegrityError imports - Added specific exception handlers before generic Exception catch-all in: 1. add_channel() function 2. add_channels_bulk() function 3. refresh_channel_info() function - Follows pattern from api/auth.py with layered exception handling - All 16 channel API tests pass Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…ons.py, api/messages.py, api/alerts.py - Added SQLAlchemyError and IntegrityError imports to all three files - Replaced bare 'except Exception' with specific database error handlers in: - collections.py: create_collection endpoint - messages.py: search_messages endpoint and get_message_media endpoint - alerts.py: create_alert endpoint - Improved error logging to include exception type name - Added database rollback on errors - Used specific error codes for better error tracking - All tests pass successfully Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Added imports: SQLAlchemyError, IntegrityError from sqlalchemy.exc - Updated register() exception handling: * Re-raise HTTPException first (preserve API error responses) * Keep existing UserAlreadyExists handler * Keep existing InvalidPasswordException handler * Added specific handler for (SQLAlchemyError, IntegrityError) for database operations * Keep Exception catch-all for truly unexpected errors - Improved error logging with exception type names - Syntax verified with py_compile Following pattern from api/channels.py and api/collections.py Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…_messages.py and jobs/alerts.py - Replace bare except Exception with specific exceptions following pattern from telegram_updates.py - collect_messages.py: Use RedisError, SQLAlchemyError, RPCError, FloodWaitError - alerts.py: Use RedisError for Redis publish operations - All tests pass Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…_setup.py and auth/users.py - telegram_setup.py: Added specific exception handling (RPCError, FloodWaitError, OSError) with Exception as final catch-all - auth/users.py: Added RuntimeError handling for asyncio task creation errors with Exception as fallback for all 3 email task creation blocks - auth_rate_limiter.py: Added missing Exception catch-all to pass test_redis_generic_exception_returns_503 test All 27 auth tests pass. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…with SQLAlchemy-specific exceptions - Replaced 'except Exception' in get_db() with 'except SQLAlchemyError' - Replaced 'except Exception' in init_db() with 'except (OperationalError, DatabaseError)' - Added imports for SQLAlchemyError, OperationalError, and DatabaseError from sqlalchemy.exc - All database and health check tests pass (3 passed, 1 skipped) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…utils/retry.py - main.py: Replaced 'except Exception' with 'except RedisError' for Redis cache initialization - main.py: Replaced 'except Exception' with 'except SQLAlchemyError' for health check database queries, kept Exception as final catch-all - utils/retry.py: Enhanced comment for Exception catch-all to clarify it's intentional for non-retryable errors - Added imports for RedisError and SQLAlchemyError - All health check tests pass (3 passed) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
✅ Full test suite verification completed: - 162 tests passed - 6 tests skipped (expected: PostgreSQL schema, PDF generation) - 3 warnings (non-critical: urllib3 OpenSSL, coroutine mock warnings) - Test execution time: 4.70s - No regressions detected All exception handling refactoring changes verified successfully across: - Service layer (translation, LLM, cache, email, telegram, queues) - API endpoints (channels, collections, messages, alerts, auth) - Background jobs and CLI - Core infrastructure (database, main app, utils) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The backend codebase contains 51 instances of 'except Exception' across 25 files (api/, services/, jobs/, auth/). These generic catches mask the true nature of failures — a SQLAlchemy IntegrityError, a Telegram NetworkError, an OpenAI RateLimitError, and a simple ValueError are all handled identically. In API endpoints, this means all unexpected errors return generic 500/502 responses, making debugging harder and hiding potentially recoverable errors. Key hotspots: llm_translator.py (7 instances), translation_service.py (5 instances), email_service.py (3 instances), channels.py (3 instances).