2017-04-23 2 views
0

Ich schreibe ein einfaches Server-Programm. Sie werden unvermeidbare Tippfehler und andere Fehler in frischem Code sein, und normalerweise druckt der Python-Interpreter ein ValueError/AttributeError-Traceback und Exit. Das Traceback kann auf die genaue Position des Fehlers zeigen. Unter dem verdrehten Rahmen werden diese Fehler jedoch nicht gedruckt. Wie im folgenden Beispiel:Wie verdreht drucken die genauen Positionen der unbehandelten Fehler

from twisted.internet import reactor, protocol, task 
#from twisted.internet.defer import setDebugging 
#setDebugging(True) 

class MyProtocol(protocol.Protocol): 
    def dataReceived(self, data): 
     try: 
      set_position(int(data)) 
     except ValueError: 
      pass 
    def connectionMade(self): 
     self.factory.clientConnectionMade(self) 
    def connectionLost(self, reason): 
     self.factory.clientConnectionLost(self) 

class MyFactory(protocol.Factory): 
    protocol = MyProtocol 
    def __init__(self): 
     self.clients = [] 
     self.lc = task.LoopingCall(self.announce) 
     self.lc.start(1) 

    def announce(self): 
     pos = A_GREAT_TYPO_HERE() 
     for client in self.clients: 
      client.transport.write("Posiiton is {0}\n".format(pos).encode('utf-8')) 

    def clientConnectionMade(self, client): 
     self.clients.append(client) 

    def clientConnectionLost(self, client): 
     self.clients.remove(client) 

def get_position(): 
    return position[0] 

def set_position(pos): 
    position[0] = pos 

def main(): 
    global position 
    position = [0] 
    myfactory = MyFactory() 
    reactor.listenTCP(5362, myfactory) 
    reactor.run() 

if __name__ == "__main__": 
    main() 

A_GREAT_TYPO_HERE() in MyFactory.announce soll get_position() sein. Aber es ist ein Tippfehler.

Und wenn der Server ausgeführt wird, nur das Terminal ausgibt

Unhandled error in Deferred:

und nichts anderes. Auch wenn ich aktivieren Aufschieben Debuggen (Kommentar- der 2. und 3. Linie), die Anschlussausgänge:

Unhandled error in Deferred: 
(debug: C: Deferred was created: 
C: File "nodes/test.py", line 48, in <module> 
C: main() 
C: File "nodes/test.py", line 43, in main 
C: myfactory = MyFactory() 
C: File "nodes/test.py", line 21, in __init__ 
C: self.lc.start(1) 
C: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/task.py", line 189, in start 
C: deferred = self._deferred = defer.Deferred() 
I: First Invoker was: 
I: File "nodes/test.py", line 48, in <module> 
I: main() 
I: File "nodes/test.py", line 43, in main 
I: myfactory = MyFactory() 
I: File "nodes/test.py", line 21, in __init__ 
I: self.lc.start(1) 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/task.py", line 194, in start 
I: self() 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/task.py", line 241, in __call__ 
I: d.addErrback(eb) 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/defer.py", line 332, in addErrback 
I: errbackKeywords=kw) 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/defer.py", line 310, in addCallbacks 
I: self._runCallbacks() 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks 
I: current.result = callback(current.result, *args, **kw) 
I: File "/home/sgsdxzy/anaconda3/lib/python3.6/site-packages/twisted/internet/task.py", line 236, in eb 
I: d.errback(failure) 
) 

Er weist den Fehler so nah wie auf self.lc.start(1), aber nicht A_GREAT_TYPO_HERE(). Wie kann ich mein Programm debuggen, damit Rückverfolgungen auf tatsächliche Fehler zeigen können?

+0

Welche Version von Twisted verwenden Sie? –

+0

@ Jean-Paul Calderone ist es 17.1.0, und Python-Version ist 3.6.1 – Light

Antwort

0

Die Zeilen "C" und "I", die Sie sehen, sind auf die Tatsache zurückzuführen, dass Sie das verzögerte Debugging aktiviert haben. Die "C" -Zeilen geben Ihnen den Stapel, in dem der Deferred erstellt wurde. Die "I" -Zeilen geben Ihnen den Stapel, in dem der Deferred "aufgerufen" wurde (seine callback oder errback Methode wurde aufgerufen).

Keine von denen ist, was Sie suchen, es scheint. Wenn Sie den Stack anzeigen möchten, der dem Failure zugeordnet ist, mit dem Deferred gefeuert wurde, ist die einfachste Lösung, sicherzustellen, dass die Failure protokolliert wird (und dass Sie eine Protokollüberwachung haben, damit Sie dieses Protokollereignis tatsächlich sehen können).

Sie sollten diese zu Ihrem main hinzufügen:

from sys import stdout 
from twisted.logger import globalLogBeginner, textFileLogObserver 
globalLogBeginner.beginLoggingTo([textFileLogObserver(stdout)]) 

Dies lenkt den Protokollstrom als Text in stdout. Es ist höchstwahrscheinlich ausreichend, um die gewünschten Informationen zu erhalten. Um wirklich sicher zu sein, möchten Sie jedoch auch explizit Fehler protokollieren, anstatt sich auf den Garbage Collector zu verlassen, um dies für Sie zu tun. So möchten Sie auch ändern:

self.lc.start(1) 

An:

# Module scope 
from twisted.logger import Logger 
logger = Logger() 

... 

# in __init__ 
d = self.lc.start(1) 
d.addErrback(lambda f: logger.failure("Loop thing problem", f)) 

(Auch möchten Sie vielleicht aus __init__ unter diesen Code betrachten und es in startFactory stattdessen setzen, auch zu prüfen, nicht einen globalen Reaktor sondern es als Parameter übergeben um)

Dies wird Ihnen Ausgang geben wie:.

2017-04-25T06:53:14-0400 [__main__.MyFactory#critical] Foo 
     Traceback (most recent call last): 
      File "debugging2.py", line 52, in main 
      myfactory = MyFactory() 
      File "debugging2.py", line 28, in __init__ 
      d = self.lc.start(1) 
      File "/tmp/debugging/local/lib/python2.7/site-packages/twisted/internet/task.py", line 194, in start 
      self() 
      File "/tmp/debugging/local/lib/python2.7/site-packages/twisted/internet/task.py", line 239, in __call__ 
      d = defer.maybeDeferred(self.f, *self.a, **self.kw) 
     --- <exception caught here> --- 
      File "/tmp/debugging/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 150, in maybeDeferred 
      result = f(*args, **kw) 
      File "debugging2.py", line 32, in announce 
      pos = A_GREAT_TYPO_HERE() 
     exceptions.NameError: global name 'A_GREAT_TYPO_HERE' is not defined 
+0

Vielen Dank! Der Logger gibt viele nützliche Informationen, ich werde die Dokumentation darüber lesen, was es bieten kann. – Light

Verwandte Themen