当我没有明确等待 future 协程(yield some_future_obj
)的结果时,我在某些情况下使用 futures 时在 tornado 中静默传递异常时遇到问题,例如无限循环协程:
@gen.coroutine
def base_func():
@gen.coroutine
def tail_something():
raise
while True:
yield some_other_coroutine
base_func()
我还注意到这个话题已经被讨论过:引用here或 here . 问题是,如果我们不显式地等待 future 的完成,则永远不会调用 future.result() 并且永远不会引发异常。但是 tornado.concurrent promise 使用 concurrent.futures 包。
现在我只是将 ioloop.add_future 卡在当前循环上并简单地执行 log.exception(future.result())。但我不喜欢这种方法,因为它有点嘈杂(生产代码中的冗余行)。
请贡献你的想法或者可能是一个真正的答案。
最佳答案
Futures“隐藏”异常的原因是您必须决定在哪里您希望异常显示。如果您希望能够在您的代码中处理异常,您必须在某处访问它的结果(在 Tornado 协程中这意味着产生它)。如果你只想记录异常,你可以让 IOLoop 为你做:
IOLoop.instance().add_future(fut, lambda fut: fut.result())
请注意,我只是调用 result() 而不是记录它的值。这确保我们在没有错误时不记录任何内容,并且异常(带回溯)由 IOLoop 的正常未处理异常机制记录。
关于python - 使用 Future 对象静默传递异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205828/