2
create errno-specific classes for IO or os calls.
7
class Error(EnvironmentError):
9
return "%s.%s %r: %s " %(self.__class__.__module__,
10
self.__class__.__name__,
11
self.__class__.__doc__,
12
" ".join(map(str, self.args)),
17
s = "[%s]: %s" %(self.__class__.__doc__,
18
" ".join(map(str, self.args)),
27
13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailiable
31
5: errno.EACCES, # anything better?
34
class ErrorMaker(object):
35
""" lazily provides Exception classes for each possible POSIX errno
36
(as defined per the 'errno' module). All such instances
37
subclass EnvironmentError.
42
def __getattr__(self, name):
44
raise AttributeError(name)
45
eno = getattr(errno, name)
46
cls = self._geterrnoclass(eno)
47
setattr(self, name, cls)
50
def _geterrnoclass(self, eno):
52
return self._errno2class[eno]
54
clsname = errno.errorcode.get(eno, "UnknownErrno%d" %(eno,))
55
errorcls = type(Error)(clsname, (Error,),
56
{'__module__':'py.error',
57
'__doc__': os.strerror(eno)})
58
self._errno2class[eno] = errorcls
61
def checked_call(self, func, *args, **kwargs):
62
""" call a function and raise an errno-exception if applicable. """
63
__tracebackhide__ = True
65
return func(*args, **kwargs)
68
except (OSError, EnvironmentError):
69
cls, value, tb = sys.exc_info()
70
if not hasattr(value, 'errno'):
72
__tracebackhide__ = False
75
if not isinstance(value, WindowsError):
78
# we are not on Windows, or we got a proper OSError
79
cls = self._geterrnoclass(errno)
82
cls = self._geterrnoclass(_winerrnomap[errno])
85
raise cls("%s%r" % (func.__name__, args))
86
__tracebackhide__ = True