python · Python
Die Meldung
RecursionError: maximum recursion depth exceeded
Was es bedeutet
Eine Funktion hat sich tiefer selbst aufgerufen als das Standardlimit von 1000 Rahmen. Viel häufiger als eine wirklich tiefe Berechnung bedeutet das, dass die Abbruchbedingung fehlt oder nie erreicht wird; auch indirekte Rekursion zählt, etwa ein __getattr__ oder eine property, die ihr eigenes Attribut erneut liest. Suchen Sie die zwei oder drei Rahmen, die sich im Traceback wiederholen, und reparieren Sie zuerst den Basisfall. sys.setrecursionlimit() hebt die Grenze, lässt Sie aber den echten C-Stack überschreiten — dann stirbt Python komplett, statt eine Ausnahme zu werfen; als Schleife neu zu schreiben ist der sichere Weg.
Die Lösung
Hier hilft kein Einzeiler. Die Erklärung sagt, worauf zu schauen ist.
- Ausgegeben von
- python
- Python
- 18
Ein Python-Traceback teilt die Antwort in zwei Hälften — die letzte Zeile sagt, was schiefging, die Rahmen darüber sagen, wo — wer also nur die letzte Zeile liest, kennt den Namen und verliert den Ort; und bei den „Wert fehlt“-Fehlern wie NoneType und KeyError liegt die Ursache fast immer in einem Rahmen über dem abgestürzten.
Eine Fehlermeldung lesen
- Von der ersten Zeile abwärts lesen. Weiter unten geht es um das Innere des Werkzeugs; die Ursache steht meist oben.
- Gibt es Datei und Zeilennummer, dort anfangen — nicht der oberste Stack-Frame, sondern die oberste Zeile, die eine eigene Datei nennt.
- Die Meldung wörtlich suchen, vorher aber eigene Pfade und Variablennamen entfernen; genau die verhindern den Treffer.
- Dieselbe Lage wird je Werkzeugversion anders formuliert. Passen die Treffer nicht, die Versionsnummer mit in die Suche.
- Vor dem Einfügen einer Lösung prüfen, was sie verwirft. Manches davon lässt sich nicht zurückholen.
Häufige Fragen
Q. Was bedeutet „RecursionError: maximum recursion depth exceeded“?
Eine Funktion hat sich tiefer selbst aufgerufen als das Standardlimit von 1000 Rahmen. Viel häufiger als eine wirklich tiefe Berechnung bedeutet das, dass die Abbruchbedingung fehlt oder nie erreicht wird; auch indirekte Rekursion zählt, etwa ein __getattr__ oder eine property, die ihr eigenes Attribut erneut liest. Suchen Sie die zwei oder drei Rahmen, die sich im Traceback wiederholen, und reparieren Sie zuerst den Basisfall. sys.setrecursionlimit() hebt die Grenze, lässt Sie aber den echten C-Stack überschreiten — dann stirbt Python komplett, statt eine Ausnahme zu werfen; als Schleife neu zu schreiben ist der sichere Weg.
Q. Wie behebe ich das?
Es gibt keinen Einzeiler. Die Erklärung oben sagt, worauf zu schauen ist.
Q. Welches Werkzeug gibt das aus?
python. Es gehört zu Python, und die Meldung hat 5 Wörter.