Python:获取WindowsError而不是IOError

我想在Windows 8上用Python 2.7.6来理解exception。

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

 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]该文件已存在时无法创build文件:'My_New_Dir'

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

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

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

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) 

那么你会发现异常。