80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
|
|
||
|
import py
|
||
|
import errno
|
||
|
|
||
|
class Error(EnvironmentError):
|
||
|
__module__ = 'py.error'
|
||
|
|
||
|
def __repr__(self):
|
||
|
return "%s.%s %r: %s " %(self.__class__.__module__,
|
||
|
self.__class__.__name__,
|
||
|
self.__class__.__doc__,
|
||
|
" ".join(map(str, self.args)),
|
||
|
#repr(self.args)
|
||
|
)
|
||
|
|
||
|
def __str__(self):
|
||
|
return "[%s]: %s" %(self.__class__.__doc__,
|
||
|
" ".join(map(str, self.args)),
|
||
|
)
|
||
|
|
||
|
_winerrnomap = {
|
||
|
2: errno.ENOENT,
|
||
|
3: errno.ENOENT,
|
||
|
17: errno.EEXIST,
|
||
|
22: errno.ENOTDIR,
|
||
|
267: errno.ENOTDIR,
|
||
|
5: errno.EACCES, # anything better?
|
||
|
}
|
||
|
# note: 'py.std' may not be imported yet at all, because
|
||
|
# the 'error' module in this file is imported very early.
|
||
|
# This is dependent on dict order.
|
||
|
|
||
|
ModuleType = type(py)
|
||
|
|
||
|
class py_error(ModuleType):
|
||
|
""" py.error lazily provides higher level Exception classes
|
||
|
for each possible POSIX errno (as defined per
|
||
|
the 'errno' module. All such Exceptions derive
|
||
|
from py.error.Error, which itself is a subclass
|
||
|
of EnvironmentError.
|
||
|
"""
|
||
|
Error = Error
|
||
|
|
||
|
def _getwinerrnoclass(cls, eno):
|
||
|
return cls._geterrnoclass(_winerrnomap[eno])
|
||
|
_getwinerrnoclass = classmethod(_getwinerrnoclass)
|
||
|
|
||
|
def _geterrnoclass(eno, _errno2class = {}):
|
||
|
try:
|
||
|
return _errno2class[eno]
|
||
|
except KeyError:
|
||
|
clsname = py.std.errno.errorcode.get(eno, "UnknownErrno%d" %(eno,))
|
||
|
cls = type(Error)(clsname, (Error,),
|
||
|
{'__module__':'py.error',
|
||
|
'__doc__': py.std.os.strerror(eno)})
|
||
|
_errno2class[eno] = cls
|
||
|
return cls
|
||
|
_geterrnoclass = staticmethod(_geterrnoclass)
|
||
|
|
||
|
def __getattr__(self, name):
|
||
|
eno = getattr(py.std.errno, name)
|
||
|
cls = self._geterrnoclass(eno)
|
||
|
setattr(self, name, cls)
|
||
|
return cls
|
||
|
|
||
|
def getdict(self, done=[]):
|
||
|
try:
|
||
|
return done[0]
|
||
|
except IndexError:
|
||
|
for name in py.std.errno.errorcode.values():
|
||
|
hasattr(self, name) # force attribute to be loaded, ignore errors
|
||
|
dictdescr = ModuleType.__dict__['__dict__']
|
||
|
done.append(dictdescr.__get__(self))
|
||
|
return done[0]
|
||
|
|
||
|
__dict__ = property(getdict)
|
||
|
del getdict
|
||
|
|
||
|
error = py_error('py.error', py_error.__doc__)
|