PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/py/_error.py

https://bitbucket.org/dac_io/pypy
Python | 86 lines | 76 code | 4 blank | 6 comment | 0 complexity | 50a8f76c4ba0c7d1285b326e3f6cab26 MD5 | raw file
  1. """
  2. create errno-specific classes for IO or os calls.
  3. """
  4. import sys, os, errno
  5. class Error(EnvironmentError):
  6. def __repr__(self):
  7. return "%s.%s %r: %s " %(self.__class__.__module__,
  8. self.__class__.__name__,
  9. self.__class__.__doc__,
  10. " ".join(map(str, self.args)),
  11. #repr(self.args)
  12. )
  13. def __str__(self):
  14. s = "[%s]: %s" %(self.__class__.__doc__,
  15. " ".join(map(str, self.args)),
  16. )
  17. return s
  18. _winerrnomap = {
  19. 2: errno.ENOENT,
  20. 3: errno.ENOENT,
  21. 17: errno.EEXIST,
  22. 13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailiable
  23. 22: errno.ENOTDIR,
  24. 267: errno.ENOTDIR,
  25. 5: errno.EACCES, # anything better?
  26. }
  27. class ErrorMaker(object):
  28. """ lazily provides Exception classes for each possible POSIX errno
  29. (as defined per the 'errno' module). All such instances
  30. subclass EnvironmentError.
  31. """
  32. Error = Error
  33. _errno2class = {}
  34. def __getattr__(self, name):
  35. if name[0] == "_":
  36. raise AttributeError(name)
  37. eno = getattr(errno, name)
  38. cls = self._geterrnoclass(eno)
  39. setattr(self, name, cls)
  40. return cls
  41. def _geterrnoclass(self, eno):
  42. try:
  43. return self._errno2class[eno]
  44. except KeyError:
  45. clsname = errno.errorcode.get(eno, "UnknownErrno%d" %(eno,))
  46. errorcls = type(Error)(clsname, (Error,),
  47. {'__module__':'py.error',
  48. '__doc__': os.strerror(eno)})
  49. self._errno2class[eno] = errorcls
  50. return errorcls
  51. def checked_call(self, func, *args, **kwargs):
  52. """ call a function and raise an errno-exception if applicable. """
  53. __tracebackhide__ = True
  54. try:
  55. return func(*args, **kwargs)
  56. except self.Error:
  57. raise
  58. except EnvironmentError:
  59. cls, value, tb = sys.exc_info()
  60. if not hasattr(value, 'errno'):
  61. raise
  62. __tracebackhide__ = False
  63. errno = value.errno
  64. try:
  65. if not isinstance(value, WindowsError):
  66. raise NameError
  67. except NameError:
  68. # we are not on Windows, or we got a proper OSError
  69. cls = self._geterrnoclass(errno)
  70. else:
  71. try:
  72. cls = self._geterrnoclass(_winerrnomap[errno])
  73. except KeyError:
  74. raise value
  75. raise cls("%s%r" % (func.__name__, args))
  76. __tracebackhide__ = True
  77. error = ErrorMaker()