Python:获取WindowsError而不是IOError

时间:2014-02-25 22:21:05

标签: python windows exception-handling

我试图在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异常?

3 个答案:

答案 0 :(得分:10)

WindowsErrorOSError的子类。来自exceptions documentation

  

在发生特定于Windows的错误或错误号与errno值不对应时引发。 winerrorstrerror值是根据Windows Platform API中GetLastError()FormatMessage()函数的返回值创建的。 errno值将winerror值映射到相应的errno.h值。这是OSError的子类。

你试图捕捉IOError但是这样的WindowsError的父类;因此,抓住OSErrorWindowsError都不够。

在此更改您的代码以使用正确的例外:

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

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

答案 1 :(得分:3)

你读错了。它是“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)

答案 2 :(得分:1)

如果在exceptions页面上搜索“WindowsError”,您会发现WindowsError实际上是Python异常。它是OSError的子类,因此文档仍然正确。如果您改为

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

然后你会发现异常。