1

当我没有明确等待未来协程(yield some_future_obj)的结果时,我在龙卷风中静默传递异常时遇到问题,例如无限循环协程:

@gen.coroutine
def base_func():

    @gen.coroutine
    def tail_something():
        raise
        while True:
           yield some_other_coroutine

    base_func()

我也注意到这个话题已经讨论过了:参考这里这里。问题是,如果我们不明确地等待未来的完成,future.result() 永远不会被调用,也永远不会引发异常。但是 tornado.concurrent 致力于使用 concurrent.futures 包。

现在我只是将 ioloop.add_future 挂在当前循环上并简单地执行 log.exception(future.result())。但我不喜欢这种方法,因为它有点吵(生产代码中的冗余行)。

请贡献您的想法,或者可能是一个真正的答案。

4

1 回答 1

4

Futures“隐藏”异常的原因是您必须决定要在哪里显示异常。如果您希望能够处理代码中的异常,则必须在某处访问其结果(这在 Tornado 协程中意味着产生它)。如果您只想记录异常,您可以要求 IOLoop 为您执行此操作:

IOLoop.instance().add_future(fut, lambda fut: fut.result())

请注意,我只是调用 result() 而不是记录它的值。这确保我们在没有错误时不记录任何内容,并且异常(带有回溯)由 IOLoop 的正常未处理异常机制记录。

于 2013-10-06T14:44:41.943 回答