Added clear_sysy_exc_info to eventlet.common.

Portable clearing of last exception information - No-op in 3.x and ys.exc_clear in 2.x
This commit is contained in:
amajorek
2010-02-28 15:18:30 -05:00
parent d3afb8ebc5
commit e3ac6b4c99
4 changed files with 17 additions and 13 deletions

View File

@@ -1,3 +1,4 @@
import sys
def get_errno(exc):
""" Get the error code out of socket.error objects.
socket.error in <2.5 does not have errno attribute
@@ -17,3 +18,11 @@ def get_errno(exc):
except IndexError:
return None
if sys.version_info[0]<3:
clear_sys_exc_info = sys.exc_clear
else:
def clear_sys_exc_info():
"""No-op In py3k.
Exception information is not visible outside of except statements.
sys.exc_clear became obsolete and removed."""
pass

View File

@@ -2,18 +2,12 @@ import heapq
import sys
import traceback
from eventlet.common import clear_sys_exc_info
from eventlet.support import greenlets as greenlet
from eventlet.hubs import timer
from eventlet import patcher
time = patcher.original('time')
# In py3k exception information is not visible outside of except statements
# so sys.exc_clear become obsolete and removed.
try:
sys_exc_clear = sys.exc_clear
except AttributeError:
sys_exc_clear = lambda: None
READ="read"
WRITE="write"
@@ -110,7 +104,7 @@ class BaseHub(object):
switch_out()
except:
self.squelch_generic_exception(sys.exc_info())
sys.exc_clear()
clear_sys_exc_info()
if self.greenlet.dead:
self.greenlet = greenlet.greenlet(self.run)
try:
@@ -118,7 +112,7 @@ class BaseHub(object):
cur.parent = self.greenlet
except ValueError:
pass # gets raised if there is a greenlet parent cycle
sys_exc_clear()
clear_sys_exc_info()
return self.greenlet.switch()
def squelch_exception(self, fileno, exc_info):
@@ -257,7 +251,7 @@ class BaseHub(object):
raise
except:
self.squelch_timer_exception(timer, sys.exc_info())
sys.exc_clear()
clear_sys_exc_info()
finally:
self.timer_finished(timer)

View File

@@ -1,7 +1,7 @@
import sys
import errno
from eventlet import patcher
from eventlet.common import get_errno
from eventlet.common import get_errno, clear_sys_exc_info
select = patcher.original('select')
time = patcher.original('time')
@@ -58,4 +58,4 @@ class Hub(BaseHub):
raise
except:
self.squelch_exception(fileno, sys.exc_info())
sys.exc_clear()
clear_sys_exc_info()

View File

@@ -4,6 +4,7 @@ are not leaked by the hub.
import sys
import unittest
from pprint import pformat
from eventlet.common import clear_sys_exc_info
from eventlet.green import socket
from eventlet.green.thread import start_new_thread
from eventlet.green.time import sleep
@@ -61,7 +62,7 @@ def run_interaction(run_client):
def run_and_check(run_client):
w = run_interaction(run_client=run_client)
sys.exc_clear()
clear_sys_exc_info()
if w():
print pformat(gc.get_referrers(w()))
for x in gc.get_referrers(w()):