Bazaka  Bazaka
Bazaka Bazaka

Reputation: 135

How can I raise Exception using eventlet in Python?

I have a simply code:

import eventlet

def execute():
    print("Start")
    timeout = Timeout(3)
    try:
        print("First")
        sleep(4)
        print("Second")
    except:
        raise TimeoutException("Error")
    finally:
        timeout.cancel()
    print("Third")

This code should throw TimeoutException, because code in 'try' block executing more than 3 seconds. But this exception shallows in the loop. I can't see it in the output

This is output:

Start
First

Process finished with exit code 0

How can I raise this exception to the output?

Upvotes: 3

Views: 1305

Answers (2)

temoto
temoto

Reputation: 5577

This code will not output Start... because nobody calls execute(), also sleep is not defined. Show real code, I will edit answer.

For now, several speculations:

  • maybe you have from time import sleep, then it's a duplicate of Eventlet timeout not exiting and the problem is that you don't give Eventlet a chance to run and realize there was a timeout, solutions: eventlet.sleep() everywhere or eventlet.monkey_patch() once.
  • maybe you don't import sleep at all, then it's a NameError: sleep and all exceptions from execute are hidden by caller.
  • maybe you run this code with stderr redirected to file or /dev/null.

Let's also fix other issues.

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")

In Python 2.x you never write except: only except Exception:.

So let's catch only proper exceptions.

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")

So let's verify that it was yours.

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

Here's same code with shorter syntax:

with eventlet.Timeout(3, TimeoutException("Error")):
  print("First")
  eventlet.sleep(4)
  print("Second")
print("Third")

I hope you really need to substitute one timeout exception for another.

Upvotes: 1

AlokThakur
AlokThakur

Reputation: 3741

Change sleep(4) to

eventlet.sleep(4)

Upvotes: 4

Related Questions