Скрученный, отложенный полный возврат - PullRequest
5 голосов
/ 01 сентября 2011

Я только учусь писать приложения на Twisted и поэтому делаю много ошибок.

Предположим, есть код:

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)

У нас есть ошибка в os.startfile (self.path) и 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

Если я раскомментирую # d.addErrback (self.command_die)

У нас есть небольшой «журнал», созданный с помощью печати ('com_die', d):

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

Есть ли способ получить полный Log \ TraceBack по времени разработки?

На данный момент я понимаю, где произошла новая ошибка, необходимо прокомментироватьaddErrorback `s

1 Ответ

5 голосов
/ 01 сентября 2011

Объект Twisted Failure имеет все необходимое.Для получения хорошей трассировки попробуйте использовать метод printTraceback () :

>>> 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

Найдите другие опции в источнике http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.2.0/twisted/python/failure.py#L121, он довольно хорошо прокомментирован.

PS: Имя d в основном используется для самой отсрочки, для результат / ошибка лучше использовать что-то вроде res / err и т. Д.

...