Verdreht nicht behandelte Fehler
Wenn die twisted-Reaktor ausgeführt wird und eine exception Auftritt in eine latente, die nicht abgefangen wird, "Unbehandelter Fehler" ist gedruckt das terminal zusammen mit einem traceback-und die Ausnahme. Ist es möglich, zu behandeln/abfangen dieser Ausnahmen (z.B., setzen Sie einen Rückruf oder eine Methode überschreiben)?
EDIT: ich bin mir bewusst, dass ich fangen kann ein Fehler durch das hinzufügen einer errback zu einem deferrerd. Was ich wissen möchte ist, ob es eine Möglichkeit abzufangen, eine nicht behandelte Fehler/Ausnahme, durchquert hat seinen Weg bis die Kette auf den Reaktor.
EDIT: im Grunde Frage ich mich, ob die twisted-Reaktor hat einen globalen error-handler oder sowas, die zugegriffen werden kann. Ich Frage mich, weil es druckt die traceback und Fehler aus dem Fehler.
Beispiel:
Unhandled Error
Traceback (most recent call last):
File "/var/projects/python/server.py", line 359, in run_server
return server.run()
File "/var/projects/python/server.py", line 881, in run
reactor.run()
File "/usr/local/lib/python2.6/dist-packages/Twisted-11.0.0-py2.6-linux-x86_64.egg/twisted/internet/base.py", line 1162, in run
self.mainLoop()
File "/usr/local/lib/python2.6/dist-packages/Twisted-11.0.0-py2.6-linux-x86_64.egg/twisted/internet/base.py", line 1171, in mainLoop
self.runUntilCurrent()
--- <exception caught here> ---
File "/usr/local/lib/python2.6/dist-packages/Twisted-11.0.0-py2.6-linux-x86_64.egg/twisted/internet/base.py", line 793, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/var/projects/python/server.py", line 524, in monitor
elapsed = time.time() - info.last
exceptions.NameError: global name 'info' is not defined
- Vielleicht ein code-snippet, das wäre nützlicher, als eine Allgemeine traceback.
- Im wesentlichen Frage ich mich, ob die twisted-Reaktor hat einen globalen error-handler oder sowas, die zugegriffen werden kann. Ich Frage mich, weil es druckt die traceback und Fehler aus dem Fehler.
- DAS ist eine klare Frage! Ich glaube nicht, aber lassen Sie mich schauen... 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil diese tracebacks sind geschrieben, mit einem Aufruf
twisted.python.log.deferr()
(Twisted-10.2 sowieso), ist es möglich redirect Sie mit einem log-Betrachter. Dies ist die häufigste, was zu tun mit dieser stack-traces. Ich finde keine Basis-Klasse für die log-Beobachter (überraschend), aber es gibt ein paar gebaut in:verdreht.python.log.PythonLoggingObserver
- Alles protokolliert, geht die standard-Python -logging
Modul. (Ich verwende das in meiner Anwendung.)verdreht.python.log.FileLogObserver
- Alles protokolliert, geht zu einer Datei.Beide fangen stack-traces gemeldet, die vom Reaktor. Alles, was Sie tun müssen, ist erstellen der log-Betrachter (keine Argumente), und rufen Sie dann das Objekt
start()
Methode.(Randbemerkung: es gibt auch eine
StdioOnnaStick
Klasse, die Sie erstellen können, und weisen Sie aufsys.stdout
odersys.stderr
wenn Sie wollen. Dann alles, was Sieprint
geht an den Verdrehten log.)Wirklich, wirklich abfangen diese Anrufe, so dass der stack-traces nie protokolliert, können Sie entweder:
twisted.internet.SelectReactor
und überschreiben Sie dierunUntilCurrent()
Methode. Das ist das, was die Protokolle der stack-traces. Sie würde studieren müssen um die Quelle dertwisted.internet.base.ReactorBase
bevor Sie dies tun.twisted.*
Importe, setzentwisted.python.log.deferr
zu einer Funktion Ihrer Wahl, das ist kompatibel mit dem Prototypdef err(_stuff=None, _why=None, **kw)
.deferr
ist zu drastisch. Das Recht, was zu tun ist, um Ihren Vorschlag über die log-Betrachter. Sie können einfach schreiben Sie Ihre eigenen und wickeln rund um eine vorhandene Beobachter, die Sie nicht brauchen, um eine Unterklasse einer der genannten Klassen.Können Sie eine errback auf die latente; unbehandelte Ausnahmen werden automatisch umgewandelt
verdreht.python.Versagen.Ausfall
.Antwort auf Ihren Kommentar:
Die Antwort ist "nicht in einem richtigen Weg".
Erste, der Reaktor hat nichts zu tun mit deferreds, eigentlich ist die ganze latente Modul platziert werden soll in der
twisted.python
- Paket, aber das kann nicht getan werden, doch weil einige Abhängigkeiten. Zurück zu deiner Frage...Graben in die twisted-code (mehr precisel, die
verdreht.internet.aufschieben
- Modul) Sie können skizzieren Sie die folgenden Ereignis-Fluss:callback
Methode wird aufgerufen, mit einem Ergebnis, das latente Instanz zu laufen beginnt seine Rückrufe durch die_runCallbacks
Methode;DebugInfo
Instanz (Zeile Fünf hundert fünf und siebzig);DebugInfo
Beispiel die garbage Collection von ad gibt es immer noch eine aktive Misserfolg als Ergebnis, dieDebugInfo.__del__
- Methode aufgerufen, und der traceback ausgedruckt werden.Da diese Räumlichkeiten, eine der einfachsten Lösungen wäre die monkey patch die
DebugInfo
Klasse:Failure
Objekte und die mit Ihnen in verschiedener Weise. Andere Antworten diskutieren einige dieser. Nicht downvote, weil es eine interessante Auseinandersetzung mit den code, aber bitte nehmen Sie nicht diesen Vorschlag.