Projektarbeit-MYP/backend/COMMON_ERRORS.md

9.9 KiB

MYP V2 - Häufige Fehler und Lösungen

Übersicht

Diese Datei dokumentiert häufige Fehler, die während der Entwicklung und dem Betrieb von MYP V2 auftreten können, sowie deren Lösungen.

🔧 Setup und Installation

Fehler: ModuleNotFoundError für PyP100

Symptom: ModuleNotFoundError: No module named 'PyP100'

Ursache: PyP100-Bibliothek ist nicht installiert

Lösung:

pip3.11 install PyP100

Fehler: Datenbankverbindung fehlgeschlagen

Symptom: sqlite3.OperationalError: unable to open database file

Ursache:

  • Fehlende Schreibberechtigung im Datenbank-Verzeichnis
  • Verzeichnis existiert nicht

Lösung:

# Verzeichnis erstellen
mkdir -p /path/to/database/directory
# Berechtigungen setzen
chmod 755 /path/to/database/directory

Fehler: Log-Verzeichnis nicht gefunden

Symptom: FileNotFoundError: [Errno 2] No such file or directory: 'logs/app/app.log'

Ursache: Log-Verzeichnisse wurden nicht erstellt

Lösung: Die ensure_log_directories() Funktion in logging_config.py wird automatisch aufgerufen

🔐 Authentifizierung und Autorisierung

Fehler: Session-Timeout zu kurz

Symptom: Benutzer werden zu häufig abgemeldet

Ursache: SESSION_LIFETIME in settings.py zu niedrig eingestellt

Lösung:

# In config/settings.py
SESSION_LIFETIME = timedelta(days=7)  # Oder gewünschte Dauer

Fehler: Admin-Rechte nicht erkannt

Symptom: AttributeError: 'AnonymousUserMixin' object has no attribute 'is_admin'

Ursache: Benutzer ist nicht angemeldet oder UserMixin-Objekt falsch erstellt

Lösung: Prüfung in Decorators verbessern:

if not current_user.is_authenticated or not hasattr(current_user, 'is_admin') or not current_user.is_admin:
    return jsonify({"error": "Keine Berechtigung"}), 403

Fehler: Passwort-Hash-Fehler

Symptom: ValueError: Invalid salt

Ursache: Inkonsistente Passwort-Hash-Methoden

Lösung: Einheitliche Verwendung von werkzeug.security:

from werkzeug.security import generate_password_hash, check_password_hash

🖨️ Drucker und Smart Plug-Steuerung

Fehler: Tapo-Verbindung fehlgeschlagen

Symptom: Exception: Failed to establish a new connection

Ursache:

  • Falsche IP-Adresse
  • Netzwerkprobleme
  • Falsche Credentials

Lösung:

  1. IP-Adresse in PRINTERS Konfiguration prüfen
  2. Netzwerkverbindung testen: ping <ip-address>
  3. Credentials in settings.py überprüfen

Fehler: Plug-Status kann nicht abgerufen werden

Symptom: KeyError: 'device_on'

Ursache: Unerwartete API-Antwort von Tapo-Gerät

Lösung: Defensive Programmierung:

plug_state = plug_info.get("device_on", False)
power_consumption = plug_info.get("current_power", 0)

Fehler: Drucker nicht in Konfiguration gefunden

Symptom: Drucker nicht in Konfiguration gefunden

Ursache: Drucker-Name stimmt nicht mit PRINTERS Dictionary überein

Lösung:

  1. Verfügbare Drucker in settings.py prüfen
  2. Exakte Schreibweise verwenden
  3. Neue Drucker zur Konfiguration hinzufügen

📅 Job-Management

Fehler: Überlappende Jobs nicht erkannt

Symptom: Mehrere Jobs laufen gleichzeitig auf einem Drucker

Ursache: Fehlerhafte Überlappungsprüfung in der Datenbank-Abfrage

Lösung: Korrekte SQL-Abfrage verwenden:

overlapping_jobs = db_session.query(Job).filter(
    Job.printer_id == printer_id,
    Job.status.in_(["scheduled", "active"]),
    ((Job.start_time <= start_time) & (Job.end_time > start_time)) | 
    ((Job.start_time < end_time) & (Job.end_time >= end_time)) |
    ((Job.start_time >= start_time) & (Job.end_time <= end_time))
).count()

Fehler: Datumsformat-Parsing fehlgeschlagen

Symptom: ValueError: time data does not match format

Ursache: Inkonsistente Datumsformate zwischen Frontend und Backend

Lösung: ISO-Format verwenden:

start_time = datetime.fromisoformat(data["start_time"].replace("Z", "+00:00"))

Fehler: Job-Status nicht aktualisiert

Symptom: Jobs bleiben im "scheduled" Status obwohl sie laufen sollten

Ursache:

  • Scheduler läuft nicht
  • Fehler im Job-Monitor

Lösung:

  1. Scheduler-Status prüfen: GET /api/scheduler/status
  2. Logs überprüfen: logs/scheduler/scheduler.log
  3. Scheduler neu starten: POST /api/scheduler/start

🗄️ Datenbank-Probleme

Fehler: Foreign Key Constraint

Symptom: sqlite3.IntegrityError: FOREIGN KEY constraint failed

Ursache: Versuch, referenzierte Datensätze zu löschen

Lösung: Abhängigkeiten vor dem Löschen prüfen:

# Vor dem Löschen eines Druckers
active_jobs = db_session.query(Job).filter(
    Job.printer_id == printer_id,
    Job.status.in_(["scheduled", "active"])
).count()

if active_jobs > 0:
    return jsonify({"error": "Es existieren aktive Jobs für diesen Drucker"}), 400

Fehler: Datenbank-Session nicht geschlossen

Symptom: ResourceWarning: unclosed <sqlite3.Connection>

Ursache: Vergessene db_session.close() Aufrufe

Lösung: Immer try/finally verwenden:

db_session = get_db_session()
try:
    # Datenbankoperationen
    pass
finally:
    db_session.close()

Fehler: Unique Constraint Violation

Symptom: sqlite3.IntegrityError: UNIQUE constraint failed

Ursache: Versuch, doppelte Einträge zu erstellen

Lösung: Vor dem Einfügen prüfen:

existing = db_session.query(User).filter(User.email == email).first()
if existing:
    return jsonify({"error": "E-Mail bereits registriert"}), 400

📊 Logging und Monitoring

Fehler: Log-Rotation funktioniert nicht

Symptom: Log-Dateien werden sehr groß

Ursache: RotatingFileHandler nicht korrekt konfiguriert

Lösung: Konfiguration in logging_config.py prüfen:

handler = RotatingFileHandler(
    log_file, 
    maxBytes=10*1024*1024,  # 10MB
    backupCount=5
)

Fehler: Logger schreibt nicht in Datei

Symptom: Keine Log-Einträge in den Dateien

Ursache:

  • Log-Level zu hoch eingestellt
  • Handler nicht korrekt hinzugefügt

Lösung:

  1. Log-Level prüfen: logger.setLevel(logging.INFO)
  2. Handler hinzufügen: logger.addHandler(handler)

Fehler: Doppelte Log-Einträge

Symptom: Jeder Log-Eintrag erscheint mehrfach

Ursache: Logger-Vererbung oder mehrfache Handler-Registrierung

Lösung: propagate deaktivieren:

logger.propagate = False

🔄 Scheduler-Probleme

Fehler: Scheduler startet nicht

Symptom: scheduler.is_running() gibt False zurück

Ursache:

  • SCHEDULER_ENABLED = False in Konfiguration
  • Fehler beim Task-Registrieren

Lösung:

  1. Konfiguration prüfen: SCHEDULER_ENABLED = True
  2. Task-Registrierung überprüfen
  3. Logs analysieren: logs/scheduler/scheduler.log

Fehler: Tasks werden nicht ausgeführt

Symptom: Job-Monitor läuft nicht automatisch

Ursache:

  • Task nicht korrekt registriert
  • Fehler in der Task-Funktion

Lösung:

  1. Task-Status prüfen: scheduler.get_task_info()
  2. Task-Funktion auf Fehler prüfen
  3. Interval-Einstellungen überprüfen

Fehler: Scheduler-Thread blockiert

Symptom: Anwendung reagiert nicht mehr

Ursache: Endlosschleife oder blockierende Operation in Task

Lösung:

  1. Timeout für externe Operationen setzen
  2. Exception-Handling in Tasks verbessern
  3. Scheduler neu starten

🌐 API und HTTP-Probleme

Fehler: CORS-Probleme

Symptom: Access-Control-Allow-Origin Fehler im Browser

Ursache: Frontend und Backend auf verschiedenen Ports

Lösung: Flask-CORS installieren und konfigurieren:

from flask_cors import CORS
CORS(app)

Fehler: 500 Internal Server Error

Symptom: Unspezifische Server-Fehler

Ursache: Unbehandelte Exceptions

Lösung:

  1. Debug-Modus aktivieren: FLASK_DEBUG = True
  2. Logs überprüfen
  3. Try-Catch-Blöcke erweitern

Fehler: JSON-Serialisierung fehlgeschlagen

Symptom: TypeError: Object of type datetime is not JSON serializable

Ursache: Datetime-Objekte in JSON-Response

Lösung: .isoformat() verwenden:

"created_at": obj.created_at.isoformat() if obj.created_at else None

🔧 Performance-Probleme

Fehler: Langsame Datenbankabfragen

Symptom: API-Responses dauern sehr lange

Ursache: Fehlende Indizes oder ineffiziente Abfragen

Lösung:

  1. Indizes auf häufig abgefragte Spalten erstellen
  2. Query-Optimierung mit EXPLAIN QUERY PLAN
  3. Eager Loading für Beziehungen verwenden

Fehler: Speicher-Leaks

Symptom: Speicherverbrauch steigt kontinuierlich

Ursache:

  • Nicht geschlossene Datenbankverbindungen
  • Zirkuläre Referenzen

Lösung:

  1. Connection-Pooling implementieren
  2. Regelmäßige Garbage Collection
  3. Memory-Profiling mit memory_profiler

🛠️ Entwicklungsumgebung

Fehler: Import-Fehler in Tests

Symptom: ModuleNotFoundError beim Ausführen von Tests

Ursache: PYTHONPATH nicht korrekt gesetzt

Lösung:

export PYTHONPATH="${PYTHONPATH}:$(pwd)"
python3.11 -m pytest

Fehler: Konfigurationsdateien nicht gefunden

Symptom: FileNotFoundError für settings.py

Ursache: Arbeitsverzeichnis stimmt nicht

Lösung: Relative Pfade verwenden oder Arbeitsverzeichnis setzen:

cd /path/to/MYP_V2
python3.11 app/app.py

📋 Checkliste für Fehlerbehebung

Vor jeder Änderung:

  1. Aktuelle Logs überprüfen
  2. Datenbank-Backup erstellen
  3. Konfiguration validieren
  4. Tests ausführen (falls vorhanden)

Nach jeder Änderung:

  1. Funktionalität testen
  2. Logs auf neue Fehler prüfen
  3. Performance-Impact bewerten
  4. Dokumentation aktualisieren

Bei kritischen Fehlern:

  1. Service stoppen
  2. Fehlerursache identifizieren
  3. Rollback-Plan erstellen
  4. Fix implementieren und testen
  5. Service neu starten
  6. Monitoring für 24h verstärken

Letzte Aktualisierung: Dezember 2024
Hinweis: Diese Datei sollte bei jedem neuen Fehler aktualisiert werden.