Python:获取WindowsError而不是IOError

我想在Windows 8上理解Python 2.7.6的异常。

这是我正在测试的代码,其目的是在My_New_Dir上创建一个新目录。 如果该目录已经存在,我想删除整个目录及其内容,然后创建一个新的目录。

import os

dir = 'My_New_Dir'
try:
    os.mkdir(dir)
except IOError as e:
    print 'exception thrown'
    shutil.rmtree(dir)
    os.mkdir(dir)

事情是,这个例外永远不会抛出。 如果该目录尚不存在,代码工作正常,但如果目录确实存在,那么我得到错误:

WindowsError:[错误183]该文件已存在时无法创建文件:'My_New_Dir'

但根据os.mkdir()的Python文档,

如果该目录已经存在,则引发OSError。

那么为什么会抛出Windows错误,而不是Python异常呢?


WindowsErrorOSError一个子OSError 。 从例外文件中:

当发生特定于Windows的错误或错误编号与errno值不对应时引发。 winerrorstrerror值是从Windows平台API的GetLastError()FormatMessage()函数的返回值创建的。 errno值将winerror值映射到相应的errno.h值。 这是OSError一个子OSError

你正试图去捕获IOError但它不是WindowsError的父类; 因此它不足以捕获OSErrorWindowsError

改变你的代码在这里使用正确的异常:

try:
    os.mkdir(dir)
except OSError as e:

或使用WindowsError ; 这会将您的代码绑定到Windows平台。


你误读了它。 它是“OSError”而不是“IOError”,WindowsError是您的特定工作操作系统的“OSError”的子类。

>>> issubclass(WindowsError, OSError)
True

此外,对于你的建议,这个API更好:

os.path.isdir(path):如果path是现有目录,则返回True。 这遵循符号链接,所以islink()和isdir()对于相同的路径可以为true。

if os.path.isdir(dir):
    shutil.rmtree(dir)
os.mkdir(dir)

如果您在异常页面上搜索“WindowsError”,则会看到WindowsError实际上是一个Python异常。 它是OSError的子OSError ,所以文档仍然是正确的。 如果你改变

try:
    os.mkdir(dir)
except OSError as e:
    print 'exception thrown'
    shutil.rmtree(dir)
    os.mkdir(dir)

那么你会发现异常。

链接地址: http://www.djcxy.com/p/83741.html

上一篇: Python: Getting a WindowsError instead of an IOError

下一篇: c++