如何在Python中使用eventlet引发Exception?

时间:2016-02-04 11:51:43

标签: python eventlet

我有一个简单的代码:

导入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

如何将此异常提升到输出?

2 个答案:

答案 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

我希望你真的需要将一个超时异常替换为另一个超时异常。