使用Future对象静默传递异常

时间:2013-10-06 05:44:52

标签: python asynchronous tornado nonblocking coroutine

我有一个问题,即在情况下使用期货时默默地传递龙卷风中的异常,当我没有明确地等待未来协程(yield some_future_obj)的结果时,例如无限循环协程:

@gen.coroutine
def base_func():

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

    base_func()

我还注意到已经讨论过这个主题:请参阅herehere。 问题是如果我们不等待将来完成显式,则永远不会调用future.result()并且永远不会引发异常。但tornado.concurrent承诺使用concurrent.futures包。

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

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

1 个答案:

答案 0 :(得分:4)

Futures" hide"例外情况是您必须确定要显示异常的 where 。如果您希望能够在代码中处理异常,则必须在某处访问其结果(在Tornado协程中,这意味着让它产生)。如果您只想记录异常,可以要求IOLoop为您执行此操作:

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

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