Search code examples
pythontwisteddeferred

Twisted, Deferred full traceback


I'm just learning to write applications on Twisted and so do a lot of mistakes.

Suppose there is a code:

d = defer.Deferred()
d.addCallback(self.start_app)
#d.addErrback(self.command_die)
d.callback(0)

def start_app(self, d):
    #import os
    return os.startfile(self.path)

def command_die(self, d):
    print ('com_die', d)

We have error in os.startfile(self.path) and Big Traceback:

Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 542, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:/Dropbox/my_py/client3.py", line 100, in command_analiz
    d.callback(i)
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 361, in callback
    self._startRunCallbacks(result)
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 455, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 542, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:/Dropbox/my_py/client3.py", line 353, in start_eve_d
    return os.startfile(self.path)
exceptions.NameError: global name 'os' is not defined

If I uncomment #d.addErrback(self.command_die)

We have little "log" create by print ('com_die', d):

('com_die', <twisted.python.failure.Failure <type 'exceptions.NameError'>>)

Is there a way to get the full Log \ TraceBack on design time?

At the moment I to understand where there was a new error, it is necessary to comment addErrorback `s


Solution

  • Twisted Failure object has everything you need. For getting nice traceback try using printTraceback() method:

    >>> from twisted.internet.defer import Deferred as D
    >>> def start_app(_):
    ...     #import os
    ...     return os.startfile('sasa')
    ... 
    ... def command_die(err):
    ...     err.printTraceback()
    ... 
    ...     
    ... d = D()
    ... d.addCallback(start_app)
    ... d.addErrback(command_die)
    ... d.callback(0)
    Traceback (most recent call last):
      File "C:\Users\Pilyavskiy\AppData\Local\DreamPie\share\dreampie\subp-py2\dreampielib\subprocess\__init__.py", line 324, in execute
        exec codeob in self.locs
      File "<pyshell#3>", line 12, in <module>
        d.callback(0)
      File "C:\pill\Python27\lib\site-packages\twisted\internet\defer.py", line 361, in callback
        self._startRunCallbacks(result)
      File "C:\pill\Python27\lib\site-packages\twisted\internet\defer.py", line 455, in _startRunCallbacks
        self._runCallbacks()
    --- <exception caught here> ---
      File "C:\pill\Python27\lib\site-packages\twisted\internet\defer.py", line 542, in _runCallbacks
        current.result = callback(current.result, *args, **kw)
      File "<pyshell#3>", line 3, in start_app
        return os.startfile('sasa')
    exceptions.NameError: global name 'os' is not defined
    

    Look for other options in source http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.2.0/twisted/python/failure.py#L121 it's pretty well commented.

    PS: Name d is mostly used for deferred itself, for result/error it's better to use something like res/err etc