Python异常语法错误

时间:2015-08-18 22:47:11

标签: python exception syntax-error try-catch

我正在为Python实现快速复制功能(因为没有人有时间使用shutil)但是我在此行上遇到语法错误E901 except (IOError, os.error), why:这里&#39 ;完整代码:

class CTError(Exception):

    def __init__(self, errors):
        self.errors = errors
try:
    O_BINARY = os.O_BINARY
except:
    O_BINARY = 0
READ_FLAGS = os.O_RDONLY | O_BINARY
WRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | O_BINARY
BUFFER_SIZE = 128 * 1024


def copyfile(src, dst):
    try:
        fin = os.open(src, READ_FLAGS)
        stat = os.fstat(fin)
        fout = os.open(dst, WRITE_FLAGS, stat.st_mode)
        for x in iter(lambda: os.read(fin, BUFFER_SIZE), ""):
            os.write(fout, x)
    finally:
        try:
            os.close(fin)
        except:
            pass
        try:
            os.close(fout)
        except:
            pass


def copytree(src, dst, symlinks=False, ignore=[]):
    names = os.listdir(src)

    if not os.path.exists(dst):
        os.makedirs(dst)
    errors = []
    for name in names:
        if name in ignore:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks, ignore)
            else:
                copyfile(srcname, dstname)
            # XXX What about devices, sockets etc.?
        except (IOError, os.error), why: #XXX Here's the bug!
            errors.append((srcname, dstname, str(why)))
        except CTError, err:
            errors.extend(err.errors)
    if errors:
        raise CTError(errors)

为什么这种语法无效?

1 个答案:

答案 0 :(得分:1)

在Python 2中,此片段的语法显示有效(CPython 2.7.10在我的机器上接受它)。

在Python 3中,这种语法不是有效的。语法,

except <TYPEEXPR>, <VAR>:

已被弃用。它被替换为,

except <TYPEEXPR> as <VAR>:
Python 3中的

,例如,

except (IOError, os.error) as why:

这种语法在Python 2中有效(我相信它已经在2.6中添加了),我觉得它更容易阅读,所以我建议在Python 2中使用它而不是弃用的语法,特别是它的前向兼容性和Python≤2.5的使用现在相当小,可能不值得支持;我相信大多数图书馆已经放弃了支持。