Python 实现简单的自定义异常类型

来源:互联网 发布:分班软件fenban 编辑:程序博客网 时间:2024/05/16 12:09
#! /usr/bin/env pythonimport os, socket, errno, types, tempfileclass NetworkError(IOError):    passclass FileError(IOError):    passdef updArgs(args, newarg=None):    if isinstance(args, IOError):        myargs = []        myargs.extend([arg for arg in args])    else:        myargs = list(args)    if newarg:        myargs.append(newarg)    return tuple(myargs)def fileArgs(fn, mode, args):    if args[0] == errno.EACCES and 'accesss' in dir(os):        perms = ''        permd = {'r': os.R_OK, 'w': os.W_OK, 'x': os.X_OK}        pkeys = permd.keys()        pkeys.sort()        pkeys.reverse()        for eachPerm in 'rwx':            if os.access(fn, permd[eachPerm]):                perms += eachPerm            else:                perms += '-'        if isinstance(args, IOError):            myargs = []            myargs.extend([arg for arg in args])        else:            myargs = list(args)        myargs[1] = "'%s' %s (perms: '%s')" % \                    (mode, myargs[1], perms)        myargs.append(args.filename)    else:        myargs = args    return tuple(myargs)def myconnect(sock, host, port):    try:        sock.connect((host, port))    except socket.error, args:        myargs = updArgs(args)        if len(myargs) == 1:            myargs = (errno.ENXIO, myargs[0])        raise NetworkError, \             updArgs(myargs, host +':' + str(port))def myopen(fn, mode='r'):    try:        fo = open(fn, mode)    except IOError, args:        raise FileError, fileArgs(fn, mode, args)    return fodef testfile():    fn = tempfile.mktemp()    f = open(fn, 'w')    f.close()    for eachTest in ((0, 'r'), (0100, 'r'), (0400, 'w'), (0500, 'w')):        try:            os.chmod(fn, eachTest[0])            f = myopen(fn, eachTest[1])        except FileError, args:            print "%s: %s" % \                (args.__class__.__name__, args)        else:            print fn, "opened ok... perm ignored"            f.close()    os.chmod(fn, 0777)    os.unlink(fn)def testnet():    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    for eachHost in ('deli', 'www'):        try:            myconnect(s, eachHost, 8080)        except NetworkError, args:            print "%s: %s" % \                  (args.__class__.__name__, args)if __name__ == '__main__':    testfile()    testnet()

c:\docume~1\beyond~1\locals~1\temp\tmpaphqao opened ok... perm ignoredc:\docume~1\beyond~1\locals~1\temp\tmpaphqao opened ok... perm ignoredFileError: [Errno 13] Permission deniedFileError: [Errno 13] Permission deniedNetworkError: [Errno 11001] getaddrinfo failed: 'deli:8080'NetworkError: [Errno 11001] getaddrinfo failed: 'www:8080'

0 0
原创粉丝点击