我想在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呢?
WindowsError
是OSError
的子OSError
。 从例外文件 :
当发生特定于Windows的错误时,或者错误编号不符合
errno
值时引发。winerror
和strerror
值是从Windows平台API的GetLastError()
和FormatMessage()
函数的返回值创建的。errno
值将winerror
值映射到相应的errno.h
值。 这是OSError
一个子OSError
。
您正在尝试捕获IOError
但不是 WindowsError
的父类; 因此它不足以捕捉OSError
或WindowsError
。
改变你的代码在这里使用正确的异常:
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)
那么你会发现异常。