【问题标题】:Sorting disk I/O errors in Python在 Python 中对磁盘 I/O 错误进行排序
【发布时间】:2009-07-12 02:48:05
【问题描述】:

如何从“尝试写入只读文件系统”中区分(区分)“磁盘已满”导致的错误? 我不想填写我的高清来找出答案:) 我想知道谁来捕获每个异常,因此当用户尝试写入 ReadOnly FS 时,我的代码可以对用户说些什么,如果用户尝试在已满的磁盘中写入文件,则可以向用户说另一条消息。

【问题讨论】:

  • @Sinan,“排序”如“排序”、“修复”、“修复”。我一直认为这是一个特殊的英国术语,但 @BlogueroConnor 似乎来自 Tatooine :-)
  • 措辞似乎有点不清楚。您的意思是,您想知道如何区分“磁盘已满”错误和“文件系统为只读”错误吗?
  • 对不起,我来自阿根廷(我希望我来自塔图因)。是的,我的意思是整理一下,正如 Craig McQueen 所说:“知道如何区分“磁盘已满”错误和“文件系统为只读”错误吗?当用户尝试写入只读文件系统时,我需要给他一个消息,如果他试图将数据写入一个完整的磁盘,我需要给另一个消息。

标签: python exception


【解决方案1】:

一旦你抓住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 或其他类型的调度。

【讨论】:

    【解决方案2】:

    在只读文件系统上,文件本身将被标记为只读。任何尝试将open 写入只读文件(O_WRONLYO_RDWR)都将失败。在类 UNIX 系统上,将设置 errno EACCES

    >>> 文件('/etc/resolv.conf', 'a') 回溯(最近一次通话最后): 文件“”,第 1 行,在 IOError:[Errno 13] 权限被拒绝:'/etc/resolv.conf'

    相比之下,尝试write 到完整文件可能会导致ENOSPC五月很关键;错误可能会延迟到fsyncclose

    >>> 文件(/dev/full, 'a').write('\n') 在文件对象析构函数中关闭失败: IOError:[Errno 28] 设备上没有剩余空间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多