我有一个简单的代码:
导入eventlet
def execute():
print("Start")
timeout = Timeout(3)
try:
print("First")
sleep(4)
print("Second")
except:
raise TimeoutException("Error")
finally:
timeout.cancel()
print("Third")
此代码应抛出TimeoutException,因为'try'块中的代码执行时间超过3秒。 但是这个例外在循环中变浅。我在输出中看不到它
这是输出:
Start
First
Process finished with exit code 0
如何将此异常提升到输出?
答案 0 :(得分:4)
将睡眠(4)改为
eventlet.sleep(4)
答案 1 :(得分:1)
此代码不会输出std::vector
,因为没有人调用Start...
,也没有定义execute()
。显示真实代码,我将编辑答案。
目前,有几种猜测:
sleep
,然后它是Eventlet timeout not exiting的副本,问题是你没有给Eventlet一个机会跑,并意识到有一个超时,解决方案:from time import sleep
到处或eventlet.sleep()
一次。eventlet.monkey_patch()
,来自NameError: sleep
的所有例外都会被来电者隐藏。execute
重定向到文件或stderr
。让我们解决其他问题。
/dev/null
在Python 2.x中,您从不仅try:
# ...
sleeep() # with 3 'e', invalid name
open('file', 'rb')
raise Http404
except:
# here you catch *all* exceptions
# in Python 2.x even SystemExit, KeyboardInterrupt, GeneratorExit
# - things you normally don't want to catch
# but in any Python version, also NameError, IOError, OSError,
# your application errors, etc, all irrelevant to timeout
raise TimeoutException("Error")
编写except:
。
所以,让我们只抓住适当的例外。
except Exception:
所以,让我们验证它是你的。
try:
# ...
execute_other() # also has Timeout, but shorter, it will fire first
except eventlet.Timeout:
# Now there may be other timeout inside `try` block and
# you will accidentally handle someone else's timeout.
raise TimeoutException("Error")
这里的语法较短的代码相同:
timeout = eventlet.Timeout(3)
try:
# ...
except eventlet.Timeout as t:
if t is timeout:
raise TimeoutException("Error")
# else, reraise and give owner of another timeout a chance to handle it
raise
我希望你真的需要将一个超时异常替换为另一个超时异常。