Python异常语法错误
Python exception syntax error
我正在为 Python 实现快速复制功能(因为没有人有时间使用 shutil)但是我在这一行收到语法错误 E901 except (IOError, os.error), why:
这是完整的代码:
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)
为什么这个语法无效?
在 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 现在的使用量非常小,可能不值得支持;我相信大多数图书馆都放弃了支持。
我正在为 Python 实现快速复制功能(因为没有人有时间使用 shutil)但是我在这一行收到语法错误 E901 except (IOError, os.error), why:
这是完整的代码:
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)
为什么这个语法无效?
在 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 现在的使用量非常小,可能不值得支持;我相信大多数图书馆都放弃了支持。