Napisałem program, który ma współprogram nazwie okresowo z głównego ioloop
tak:W Tornado, jak mogę zobaczyć wyjątki rasied w coroutine wywoływane przez PeriodicCallback?
from tornado import ioloop, web, gen, log
tornado.log.enable_pretty_printing()
import logging; logging.basicConfig()
@gen.coroutine
def callback():
print 'get ready for an error...'
raise Exception()
result = yield gen.Task(my_async_func)
l = ioloop.IOLoop.instance()
cb = ioloop.PeriodicCallback(callback, 1000, io_loop=l)
cb.start
l.start()
Wyjście mogę to po prostu:
$ python2 app.py
get ready for an error...
get ready for an error...
get ready for an error...
get ready for an error...
The raise Exception()
jest ignorowana! Jeśli zmienię wywołanie zwrotne na
def callback():
print 'get ready for an error...'
raise Exception()
Dostaję pełny ślad stosu, tak jak oczekuję (i potrzebuję). W jaki sposób mogę uzyskać ślad stosu podczas korzystania z coroutine?
Do obsługi wyjątków gen.coroutine przechwytuje błędy "wyjątku". gen.engine tego nie rób. Zobacz http://stackoverflow.com/a/23502625/1066801 – M07