bugfix
This commit is contained in:
@@ -203,6 +203,43 @@ COLUMN_MAP = {
|
|||||||
# Beispielhafte Definition (bitte an deine Spalten anpassen!)
|
# Beispielhafte Definition (bitte an deine Spalten anpassen!)
|
||||||
# COLUMN_MAP = { ... dein komplettes Mapping ... }
|
# 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
|
@retry_on_failure # Annahme: Decorator existiert
|
||||||
def serp_wikipedia_lookup(company_name, website=None):
|
def serp_wikipedia_lookup(company_name, website=None):
|
||||||
"""
|
"""
|
||||||
@@ -602,42 +639,7 @@ def prepare_data_for_modeling(sheet_handler):
|
|||||||
# except Exception as e:
|
# except Exception as e:
|
||||||
# print(f"Fehler beim Testaufruf: {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 ====================
|
# ==================== LOGGING & HELPER FUNCTIONS ====================
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user