Verdrehter unbehandelter Fehler

8

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%     
cpburnz 05.08.2011, 21:16
quelle

3 Antworten

6

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:

  • Unterklasse 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.
  • Nachdem Sie alle 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) .
  • kompatibel ist
wberry 05.08.2011, 22:08
quelle
3

Sie können dem Deferred einen Fehler hinzufügen. Nicht behandelte Ausnahmen werden automatisch in twisted.python.failure.Failure konvertiert.

    
GaretJax 05.08.2011 21:19
quelle
1

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:

  1. Wenn die Methode callback mit einem Ergebnis aufgerufen wird, beginnt die verzögerte Instanz ihre Callbacks über _runCallbacks Methode;
  2. Wenn einer der Callbacks eine Ausnahme auslöst, wird sie in den Fehler (Zeile 542 );
  3. Wenn die Rückrufkette erschöpft ist und das letzte Ergebnis ein Fehler war, wird das aktuelle Ergebnis der failResult-Eigenschaft von DebugInfo Instanz (Zeile 575 );
  4. Wenn die verzögerte Instanz und somit ihre 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:

%Vor%     
GaretJax 05.08.2011 22:12
quelle