Wenn der verdrehte Reaktor läuft und eine Ausnahme innerhalb einer verzögerten auftritt, die nicht abgefangen wird, wird "Unhandled Error" zusammen mit einer Rückverfolgung und der Ausnahme auf das Terminal gedruckt. Ist es möglich, diese Ausnahmen zu behandeln / abzufangen (z. B. einen Rückruf festlegen oder eine Methode überschreiben)?
BEARBEITEN: Ich bin mir bewusst, dass ich einen Fehler durch Hinzufügen eines Fehlers zu einem Deferrer erhalten kann. Was ich wissen möchte, ist, wenn es eine Möglichkeit gibt, einen unbehandelten Fehler / eine Ausnahme abzufangen, die ihren Weg die Kette hinauf zum Reaktor durchlaufen hat.
BEARBEITEN: Im Grunde frage ich mich, ob der verdrehte Reaktor einen globalen Fehlerhandler oder etwas hat, auf das zugegriffen werden kann. Ich frage mich, weil es die Rückverfolgung und den Fehler von dem Fehler druckt.
Beispiel:
%Vor% Da diese Tracebacks mit einem Aufruf von twisted.python.log.deferr()
geschrieben werden (in Twisted 10.2 sowieso), ist es möglich, sie mit einem Log-Observer umzuleiten . Dies ist die gebräuchlichste Sache mit diesen Stack-Traces. Ich kann (überraschend) keine Basisklasse für Log-Beobachter finden, aber es sind ein paar eingebaut:
twisted.python.log.PythonLoggingObserver
- Alles Geloggte geht an den Standard Python logging
Modul. (Ich benutze dies in meiner Anwendung.)
twisted.python.log.FileLogObserver
- Alles Geloggte geht in eine Datei.
Beide werden die vom Reaktor berichteten Stapelspuren auffangen. Alles, was Sie tun müssen, ist den Log-Observer zu konstruieren (keine Argumente) und dann die Methode start()
des Objekts aufzurufen.
(Randnotiz: Es gibt auch eine StdioOnnaStick
Klasse das kannst du konstruieren und auf sys.stdout
oder sys.stderr
zuweisen, wenn du willst. Dann geht alles, was du print
in das Twisted-Log gehst.)
Um diese Aufrufe wirklich, wirklich abzufangen , werden die Stack-Traces überhaupt nicht protokolliert. Sie könnten entweder:
twisted.internet.SelectReactor
und überschreiben Sie ihre runUntilCurrent()
-Methode. Das protokolliert die Stack-Traces. Sie müssten die Quelle von twisted.internet.base.ReactorBase
untersuchen, bevor Sie dies tun. twisted.*
Importe durchgeführt haben, setzen Sie twisted.python.log.deferr
auf eine Funktion Ihrer Wahl, die mit dem Prototyp def err(_stuff=None, _why=None, **kw)
. Sie können dem Deferred einen Fehler hinzufügen. Nicht behandelte Ausnahmen werden automatisch in twisted.python.failure.Failure
konvertiert.
Beantworten Sie Ihren Kommentar:
Im Wesentlichen frage ich mich, ob der verdrehte Reaktor einen globalen Fehler-Handler oder etwas hat, auf das zugegriffen werden kann. Ich frage mich, weil es die Rückverfolgung und den Fehler von dem Fehler druckt.
Die Antwort ist "nicht in der richtigen Weise".
Erstens hat der Reaktor nichts mit Deferred zu tun, eigentlich sollte das gesamte zurückgestellte Modul in das twisted.python
-Paket gestellt werden, aber dies kann wegen einiger Abhängigkeiten noch nicht gemacht werden. Zurück zu deiner Frage ...
Digging in den verdrehten Code (genauer gesagt, das twisted.internet.defer
Modul) Sie können den folgenden Ereignisfluss umreißen:
callback
mit einem Ergebnis aufgerufen wird, beginnt die verzögerte Instanz ihre Callbacks über _runCallbacks
Methode; DebugInfo
Instanz (Zeile 575 ); DebugInfo
-Instanz "Garbage collected" sind, gibt es immer noch einen aktiven Fehler, der DebugInfo.__del__
wird aufgerufen und das Traceback ausgedruckt. Angesichts dieser Prämissen wäre eine der einfachsten Lösungen, die Klasse DebugInfo
zu patchen:
Tags und Links python reactor twisted twisted.internet