Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-01 23:50:28 +02:00
Commit 04585e95b6
290 geänderte Dateien mit 64086 neuen und 0 gelöschten Zeilen

Datei anzeigen

Datei anzeigen

@ -0,0 +1,169 @@
"""
Zentralisiertes Error Handling für AccountForger
"""
import logging
from typing import Dict, Any, Optional
from dataclasses import dataclass
from domain.exceptions import (
AccountCreationException,
RateLimitException,
CaptchaRequiredException,
ValidationException,
ProxyException,
NetworkException,
AccountForgerException
)
@dataclass
class ErrorResult:
"""Strukturiertes Fehler-Ergebnis"""
user_message: str
technical_details: str
recovery_suggestion: Optional[str] = None
error_type: Optional[str] = None
retry_possible: bool = False
retry_after: Optional[int] = None
class ErrorHandler:
"""Zentralisiertes Error Handling"""
def __init__(self, logger: Optional[logging.Logger] = None):
self.logger = logger or logging.getLogger(__name__)
def handle_account_creation_error(self, error: Exception, context: Dict[str, Any]) -> ErrorResult:
"""Behandelt Account-Erstellungsfehler einheitlich"""
self.logger.error(f"Account creation failed: {error}", extra=context)
# Spezifische Exception-Typen behandeln
if isinstance(error, RateLimitException):
return ErrorResult(
user_message=error.user_friendly_message,
technical_details=str(error),
recovery_suggestion=error.recovery_suggestion,
error_type="rate_limit",
retry_possible=True,
retry_after=error.retry_after
)
elif isinstance(error, CaptchaRequiredException):
return ErrorResult(
user_message=error.user_friendly_message,
technical_details=str(error),
recovery_suggestion=error.recovery_suggestion,
error_type="captcha",
retry_possible=False
)
elif isinstance(error, ValidationException):
return ErrorResult(
user_message=f"Eingabefehler: {error.message}",
technical_details=str(error),
recovery_suggestion="Bitte überprüfen Sie Ihre Eingaben",
error_type="validation",
retry_possible=False
)
elif isinstance(error, ProxyException):
return ErrorResult(
user_message="Proxy-Verbindungsfehler",
technical_details=str(error),
recovery_suggestion="Überprüfen Sie Ihre Proxy-Einstellungen",
error_type="proxy",
retry_possible=True
)
elif isinstance(error, NetworkException):
return ErrorResult(
user_message="Netzwerkverbindungsfehler",
technical_details=str(error),
recovery_suggestion=error.details.get("recovery_suggestion", "Überprüfen Sie Ihre Internetverbindung"),
error_type="network",
retry_possible=True
)
elif isinstance(error, AccountCreationException):
return ErrorResult(
user_message=error.user_friendly_message,
technical_details=str(error),
recovery_suggestion=error.recovery_suggestion,
error_type=error.error_type,
retry_possible=True
)
# Generische Fehler
else:
return ErrorResult(
user_message="Ein unerwarteter Fehler ist aufgetreten",
technical_details=str(error),
recovery_suggestion="Bitte versuchen Sie es später erneut",
error_type="unknown",
retry_possible=True
)
def interpret_error_message(self, error_msg: str, platform: str) -> ErrorResult:
"""Interpretiert String-Fehlermeldungen und gibt strukturierte Ergebnisse zurück"""
error_lower = error_msg.lower()
# Rate Limit Patterns
if any(pattern in error_lower for pattern in ["rate limit", "too many", "zu viele"]):
return ErrorResult(
user_message="Zu viele Versuche - bitte später erneut versuchen",
technical_details=error_msg,
recovery_suggestion="Warten Sie 5-10 Minuten vor dem nächsten Versuch",
error_type="rate_limit",
retry_possible=True,
retry_after=300 # 5 Minuten
)
# Captcha Patterns
elif any(pattern in error_lower for pattern in ["captcha", "verification required", "verifizierung erforderlich"]):
return ErrorResult(
user_message=f"{platform} erfordert eine Captcha-Verifizierung",
technical_details=error_msg,
recovery_suggestion="Nutzen Sie einen anderen Proxy oder versuchen Sie es später",
error_type="captcha",
retry_possible=False
)
# Username Patterns
elif any(pattern in error_lower for pattern in ["username", "benutzername", "already taken", "bereits vergeben"]):
return ErrorResult(
user_message="Der gewählte Benutzername ist nicht verfügbar",
technical_details=error_msg,
recovery_suggestion="Versuchen Sie einen anderen Benutzernamen",
error_type="username_taken",
retry_possible=True
)
# Password Patterns
elif any(pattern in error_lower for pattern in ["password", "passwort", "weak", "schwach"]):
return ErrorResult(
user_message="Das Passwort erfüllt nicht die Anforderungen",
technical_details=error_msg,
recovery_suggestion=f"Verwenden Sie ein stärkeres Passwort mit Groß-/Kleinbuchstaben, Zahlen und Sonderzeichen",
error_type="weak_password",
retry_possible=True
)
# Network Patterns
elif any(pattern in error_lower for pattern in ["network", "netzwerk", "connection", "verbindung", "timeout"]):
return ErrorResult(
user_message="Netzwerkverbindungsfehler",
technical_details=error_msg,
recovery_suggestion="Überprüfen Sie Ihre Internetverbindung",
error_type="network",
retry_possible=True
)
# Default
else:
return ErrorResult(
user_message=f"Fehler bei der Registrierung: {error_msg}",
technical_details=error_msg,
recovery_suggestion="Überprüfen Sie Ihre Eingaben und versuchen Sie es erneut",
error_type="unknown",
retry_possible=True
)