From 38eb9cbce9bc7ec24a7953cd789fcf25e03f46f1 Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 22 Apr 2025 05:38:11 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 72 ++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 24a9f831..f9b3a751 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -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 ====================