pypy-postgresql / py /

create errno-specific classes for IO or os calls. 

import sys, os, errno

class Error(EnvironmentError):
    def __repr__(self):
        return "%s.%s %r: %s " %(self.__class__.__module__,
                               " ".join(map(str, self.args)),

    def __str__(self):
        s = "[%s]: %s" %(self.__class__.__doc__,
                          " ".join(map(str, self.args)),
        return s

_winerrnomap = {
    2: errno.ENOENT, 
    3: errno.ENOENT, 
    17: errno.EEXIST,
    22: errno.ENOTDIR,
    267: errno.ENOTDIR,
    5: errno.EACCES,  # anything better?

class ErrorMaker(object):
    """ lazily provides Exception classes for each possible POSIX errno 
        (as defined per the 'errno' module).  All such instances 
        subclass EnvironmentError.  
    Error = Error
    _errno2class = {}

    def __getattr__(self, name):
        eno = getattr(errno, name)
        cls = self._geterrnoclass(eno)
        setattr(self, name, cls)
        return cls

    def _geterrnoclass(self, eno):
            return self._errno2class[eno]
        except KeyError:
            clsname = errno.errorcode.get(eno, "UnknownErrno%d" %(eno,))
            errorcls = type(Error)(clsname, (Error,),
                     '__doc__': os.strerror(eno)})
            self._errno2class[eno] = errorcls
            return errorcls

    def checked_call(self, func, *args):
        """ call a function and raise an errno-exception if applicable. """
        __tracebackhide__ = True
            return func(*args)
        except self.Error:
        except EnvironmentError:
            cls, value, tb = sys.exc_info()
            if not hasattr(value, 'errno'):
            __tracebackhide__ = False
            errno = value.errno 
                if not isinstance(value, WindowsError): 
                    raise NameError
            except NameError: 
                # we are not on Windows, or we got a proper OSError
                cls = self._geterrnoclass(errno)
                    cls = self._geterrnoclass(_winerrnomap[errno]) 
                except KeyError:    
                    raise value 
            raise cls("%s%r" % (func.__name__, args))
            __tracebackhide__ = True

error = ErrorMaker()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.