This commit is contained in:
2025-04-22 05:38:11 +00:00
parent 849840054c
commit 38eb9cbce9

View File

@@ -203,6 +203,43 @@ COLUMN_MAP = {
# Beispielhafte Definition (bitte an deine Spalten anpassen!)
# COLUMN_MAP = { ... dein komplettes Mapping ... }
# ==================== RETRY-DECORATOR ====================
def retry_on_failure(func):
def wrapper(*args, **kwargs):
func_name = func.__name__
# Versuche, das 'self' Argument für Methoden zu extrahieren
self_arg = args[0] if args and hasattr(args[0], func_name) else None
effective_func_name = f"{self_arg.__class__.__name__}.{func_name}" if self_arg else func_name
for attempt in range(Config.MAX_RETRIES):
try:
return func(*args, **kwargs)
except Exception as e:
error_msg = str(e)
# Spezifische Fehlerbehandlung (Beispiel)
if isinstance(e, gspread.exceptions.APIError):
if e.response.status_code == 429: # Rate Limit
wait_time = Config.RETRY_DELAY * (attempt + 1) # Exponential backoff
print(f"🚦 Rate Limit bei {effective_func_name} (Versuch {attempt+1}). Warte {wait_time}s... Fehler: {error_msg[:100]}")
time.sleep(wait_time)
continue # Direkt zum nächsten Versuch
else:
print(f"⚠️ Google API Fehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
elif isinstance(e, requests.exceptions.RequestException):
print(f"⚠️ Netzwerkfehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
elif isinstance(e, openai.error.OpenAIError):
print(f"⚠️ OpenAI Fehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
else:
print(f"⚠️ Unbekannter Fehler bei {effective_func_name} (Versuch {attempt+1}): {type(e).__name__} - {error_msg[:100]}")
if attempt < Config.MAX_RETRIES - 1:
time.sleep(Config.RETRY_DELAY)
else:
print(f"❌ Endgültiger Fehler bei {effective_func_name} nach {Config.MAX_RETRIES} Versuchen.")
return None # Oder eine spezifische Fehlerkennung zurückgeben
return None # Sollte nicht erreicht werden, aber zur Sicherheit
return wrapper
@retry_on_failure # Annahme: Decorator existiert
def serp_wikipedia_lookup(company_name, website=None):
"""
@@ -602,42 +639,7 @@ def prepare_data_for_modeling(sheet_handler):
# except Exception as e:
# print(f"Fehler beim Testaufruf: {e}")
# ==================== RETRY-DECORATOR ====================
def retry_on_failure(func):
def wrapper(*args, **kwargs):
func_name = func.__name__
# Versuche, das 'self' Argument für Methoden zu extrahieren
self_arg = args[0] if args and hasattr(args[0], func_name) else None
effective_func_name = f"{self_arg.__class__.__name__}.{func_name}" if self_arg else func_name
for attempt in range(Config.MAX_RETRIES):
try:
return func(*args, **kwargs)
except Exception as e:
error_msg = str(e)
# Spezifische Fehlerbehandlung (Beispiel)
if isinstance(e, gspread.exceptions.APIError):
if e.response.status_code == 429: # Rate Limit
wait_time = Config.RETRY_DELAY * (attempt + 1) # Exponential backoff
print(f"🚦 Rate Limit bei {effective_func_name} (Versuch {attempt+1}). Warte {wait_time}s... Fehler: {error_msg[:100]}")
time.sleep(wait_time)
continue # Direkt zum nächsten Versuch
else:
print(f"⚠️ Google API Fehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
elif isinstance(e, requests.exceptions.RequestException):
print(f"⚠️ Netzwerkfehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
elif isinstance(e, openai.error.OpenAIError):
print(f"⚠️ OpenAI Fehler bei {effective_func_name} (Versuch {attempt+1}): {error_msg[:100]}")
else:
print(f"⚠️ Unbekannter Fehler bei {effective_func_name} (Versuch {attempt+1}): {type(e).__name__} - {error_msg[:100]}")
if attempt < Config.MAX_RETRIES - 1:
time.sleep(Config.RETRY_DELAY)
else:
print(f"❌ Endgültiger Fehler bei {effective_func_name} nach {Config.MAX_RETRIES} Versuchen.")
return None # Oder eine spezifische Fehlerkennung zurückgeben
return None # Sollte nicht erreicht werden, aber zur Sicherheit
return wrapper
# ==================== LOGGING & HELPER FUNCTIONS ====================