說,我有一個函數,它是用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