我有一个问题,即在情况下使用期货时默默地传递龙卷风中的异常,当我没有明确地等待未来协程(yield some_future_obj
)的结果时,例如无限循环协程:
@gen.coroutine
def base_func():
@gen.coroutine
def tail_something():
raise
while True:
yield some_other_coroutine
base_func()
我还注意到已经讨论过这个主题:请参阅here或here。 问题是如果我们不等待将来完成显式,则永远不会调用future.result()并且永远不会引发异常。但tornado.concurrent承诺使用concurrent.futures包。
现在我只是将ioloop.add_future挂在当前循环上,然后执行log.exception(future.result())。但我不喜欢这种方法,因为它有点嘈杂(生产代码中的冗余行)。
请提出您的想法,或者可能是一个真正的答案。
答案 0 :(得分:4)
Futures" hide"例外情况是您必须确定要显示异常的 where 。如果您希望能够在代码中处理异常,则必须在某处访问其结果(在Tornado协程中,这意味着让它产生)。如果您只想记录异常,可以要求IOLoop为您执行此操作:
IOLoop.instance().add_future(fut, lambda fut: fut.result())
请注意,我只是调用result()而不是记录其值。这可确保我们在没有错误时不记录任何内容,并且IOLoop的正常未处理异常机制会记录异常(带回溯)。