gpt4 book ai didi

python - 在 Tornado 中,如何查看在 PeriodicCallback 调用的协程中引发的异常?

转载 作者:太空狗 更新时间:2023-10-29 17:47:46 24 4
gpt4 key购买 nike

我写了一个程序,它有一个从主 ioloop 定期调用的协程,如下所示:

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

我得到的输出很简单:

$ python2 app.py
get ready for an error...
get ready for an error...
get ready for an error...
get ready for an error...

raise Exception() 被默默地忽略了!如果我将回调更改为

def callback():
print 'get ready for an error...'
raise Exception()

我得到了我期望(和需要)的完整堆栈跟踪。如何在使用协程时获取堆栈跟踪?

最佳答案

@tornado.gen.coroutine 使函数返回 tornado.concurrent.Future 对象,因此您不必将其包装到 tornado.gen.Task 但您可以使用 yield 关键字调用它:

@tornado.gen.coroutine
def inner():
logging.info('inner')

@tornado.gen.coroutine
def outer():
logging.info('outer')
yield inner()

以这种方式装饰的函数中的异常被包装到这个 tornado.concurrent.Future 对象中,稍后可以使用它的 exception() 方法返回它。在您的情况下,tornado.ioloop.PeriodicCallback 调用您的回调方法,之后它只是丢弃返回的 tornado.concurrent.Future 对象及其包含的异常。要检测异常,您可以使用链式调用:

@tornado.gen.coroutine
def inner():
raise Exception()

@tornado.gen.coroutine
def outer():
try:
yield inner()
except Exception, e:
logging.exception(e)

但在您的情况下,在 throw 后立即捕获它实际上更容易:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import tornado.gen
import tornado.ioloop
import tornado.options
import logging

tornado.options.parse_command_line()

@tornado.gen.coroutine
def callback():
logging.info('get ready for an error...')
try:
raise Exception()
except Exception, e:
logging.exception(e)

main_loop = tornado.ioloop.IOLoop.instance()
scheduler = tornado.ioloop.PeriodicCallback(callback, 1000, io_loop = main_loop)
scheduler.start()
main_loop.start()

@gen.engine 不会使函数返回 tornado.concurrent.Future,因此不会包装异常。

关于python - 在 Tornado 中,如何查看在 PeriodicCallback 调用的协程中引发的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com