bugfix
This commit is contained in:
@@ -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 ====================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user