在Python中排序磁盘I / O错误

时间:2009-07-12 02:48:06

标签: python exception

如何从“尝试写入只读文件系统”中排除(区分)从“磁盘已满状态”派生的错误? 我不想填写我的高清来找出:) 我想要的是知道谁捕获每个异常,所以我的代码可以在用户尝试写入ReadOnly FS时向用户说些什么,如果用户试图在磁盘已满的情况下写入文件,则可以说出另一条消息。

2 个答案:

答案 0 :(得分:10)

抓住IOError,例如使用Python 2. *中的except IOError, e:子句,您可以检查e.errno以确切地找出它是什么类型的I / O错误(遗憾的是,它不一定在不同的操作系统中完全可移植)

参见Python标准库中的errno模块;在R / O文件系统上打开文件(在合理的操作系统上)应该生成errno.EPERMerrno.EACCES或更好errno.EROFS(“只读文件系统”);如果文件系统是R / W但是没有剩余空间你应该得到errno.ENOSPC(“设备上没有剩余空间”)。但是你需要在你关心的操作系统上进行试验(用一个小的USB密钥来填充它应该很容易; - )。

根据errno,无法使用不同的except子句 - 这些子句必须通过它们捕获的异常的来区分,而不是通过异常实例的属性来区分 - 所以您需要在单个except IOError, e:子句中进行if / else或其他类型的调度。

答案 1 :(得分:2)

在只读文件系统上,文件本身将被标记为只读。任何open只读文件(O_WRONLYO_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五月至关重要;错误可能会延迟到fsyncclose

>>> file(/dev/full, 'a').write('\n')
close failed in file object destructor:
IOError: [Errno 28] No space left on device