PermissionError:[WinError 5]而不是IsADirectoryError

时间:2019-12-18 20:36:16

标签: python error-handling operating-system

根据os模块的官方文档,IsADirectoryError是在目录上使用os.remove()时引发的异常。

我希望以下代码可以创建和删除目录,但会出错:

>>> os.mkdir(r'C:\test')
>>> try:
...     os.remove(r'C:\test')
... except IsADirectoryError:
...     os.rmdir(r'C:\test')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
PermissionError: [WinError 5] Access is denied: 'C:\\test'

为什么会出现权限错误而不是预期的IsADirectoryError?

编辑:只需运行os.rmdir(r'C:\ test')即可,因此我的脚本确实有权删除该文件夹。

编辑:建议我捕获WinError 5并尝试将其作为文件夹处理,如果不起作用,请继续处理WinError 5的其他错误可能性。如下所示,这可以快速创建丑陋的代码。有没有办法区分引发WinError 5异常的不同错误?如果没有,是否有一种更整洁的方式来处理所有可能的情况?

try:
    os.remove(r'C:\test')
except WindowsError as e:
    if e.winerror==5: #maybe it's a directory
        try: 
            os.rmdir(r'C:\test')
        except WindowsError as f:
            if f.winerror==5: #maybe it's read-only
                try:
                    os.chmod(r'C:\test', 0o777)
                except WindowsError as g:
                    if f.winerror==5: #maybe we don't have access
                    ...

1 个答案:

答案 0 :(得分:0)

文档(https://docs.python.org/3.8/library/exceptions.html)说IsADirectoryError对应于errno = EISDIR,因此如果操作系统返回了EISDIR,则会引发此错误。 Windows使用os.remove删除目录时会引发WindowsError,因为Python不会从OS那里获取EISDIR作为响应,而是通过其他方式得到。这可以简单地处理:

combinedAddress = [address, city, state, zip].filter(Boolean).join(", ");