我试图在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异常?
答案 0 :(得分:10)
WindowsError
是OSError
的子类。来自exceptions documentation:
在发生特定于Windows的错误或错误号与
errno
值不对应时引发。winerror
和strerror
值是根据Windows Platform API中GetLastError()
和FormatMessage()
函数的返回值创建的。errno
值将winerror
值映射到相应的errno.h
值。这是OSError
的子类。
你试图捕捉IOError
但是不这样的WindowsError
的父类;因此,抓住OSError
和WindowsError
都不够。
在此更改您的代码以使用正确的例外:
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)
然后你会发现异常。