说,我有一个函数,它是用gen.engine包装来“理顺”回调链,也就是说,使代码看起来是同步的/线性/任何。用另一个函数包装一个tornado.gen.engine包装的函数
的功能,那么像这样
@gen.engine
def func():
...
yield gen.Task(...)
...
yield gen.Task(...)
等。我明白,我绝对可以使用try /除了在yield
s之外来捕捉函数中发生的异常,这是由gen.Task
包装的。如果我需要将函数func
本身封装到另一个函数中(这是实际用例),则在func
中捕获所有“未被捕获”异常,而不会引入“丑陋”(正确..)try/except,这将跨越整个func
?
我想出这个:
@gen.engine
def func(..., callback):
...
callback()
@gen.engine
def outer():
try:
yield gen.Task(func)
except Exception as e:
# Log the exception
# Stop ioloop (or something)
这增添了几分一般性到func
,但引入了一个额外的参数,并在func
一些人为的逻辑。
有没有其他方式做到这一点?请注意,“紧急异常捕获”或多或少是针对此问题的人为用例(这可能以其他方式完成),我所看到的是调用这些tornado.gen的正确方法。引擎包装的功能来自另一个功能。
编辑:傻我,我应该提到我只限于龙卷风2.x!
weeeell,是的,谢谢你的回答,但不幸的是我忘了提,我被限制在龙卷风2.x.否则,我很高兴知道,必须在龙卷风3中跳过更少的箍。感谢您的努力 – shylent
@shylent,我更新了我的答案。 – Nykakin
没错,非常感谢。基本上,这证实了,我在我的问题中提出的方法是唯一的方法,这很好理解。 – shylent