如何从“尝试写入只读文件系统”中排除(区分)从“磁盘已满状态”派生的错误? 我不想填写我的高清来找出:) 我想要的是知道谁捕获每个异常,所以我的代码可以在用户尝试写入ReadOnly FS时向用户说些什么,如果用户试图在磁盘已满的情况下写入文件,则可以说出另一条消息。
答案 0 :(得分:10)
抓住IOError
,例如使用Python 2. *中的except IOError, e:
子句,您可以检查e.errno
以确切地找出它是什么类型的I / O错误(遗憾的是,它不一定在不同的操作系统中完全可移植)
参见Python标准库中的errno模块;在R / O文件系统上打开文件(在合理的操作系统上)应该生成errno.EPERM
,errno.EACCES
或更好errno.EROFS
(“只读文件系统”);如果文件系统是R / W但是没有剩余空间你应该得到errno.ENOSPC
(“设备上没有剩余空间”)。但是你需要在你关心的操作系统上进行试验(用一个小的USB密钥来填充它应该很容易; - )。
根据errno,无法使用不同的except
子句 - 这些子句必须通过它们捕获的异常的类来区分,而不是通过异常实例的属性来区分 - 所以您需要在单个except IOError, e:
子句中进行if / else或其他类型的调度。
答案 1 :(得分:2)
在只读文件系统上,文件本身将被标记为只读。任何open
只读文件(O_WRONLY
或O_RDWR
)的尝试都将失败。在类UNIX系统上,将设置错误EACCES
。
>>> file('/etc/resolv.conf', 'a') Traceback (most recent call last): File "", line 1, in IOError: [Errno 13] Permission denied: '/etc/resolv.conf'
相反,尝试write
到完整文件可能会导致ENOSPC
。 五月至关重要;错误可能会延迟到fsync
或close
。
>>> file(/dev/full, 'a').write('\n') close failed in file object destructor: IOError: [Errno 28] No space left on device