【问题标题】:Best practice for raising IOError exception in Python在 Python 中引发 IOError 异常的最佳实践
【发布时间】:2014-03-15 15:12:54
【问题描述】:

我正在编写一个小型 Python 接口,用于通过 sysfs 从 DS18B20 传感器读取温度。除了温度之外,还可以读取 CRC 和的状态。为了触发 CRC 错误,我决定使用IOError

sn = "28-000005589697"  # sensor serial number
# file containing information of temperature and if CRC is valid: 
fname = "sys/bus/w1/devices/" + sn + "/w1_slave"
with open(fname, 'f') as f: 
...
raise IOError("Invalid CRC in {}!".format(sn))

据我了解IOError,它有成员messagefilenameerrnostrerror。通过我的方法,只使用message。好像我在这里遗漏了什么。

引发IOError 异常的最佳做法是什么,以便它与磁盘已满找不到文件等其他错误很好地融合在一起?

【问题讨论】:

  • 您不应该使用IOError,因为这不是 I/O 问题(您可以读取数据),而是完整性问题(您读取的内容不正确或损坏)。改为定义 CRCErrorIntegrityError 或其他。
  • @Stefano,这可能是最直接的解决方案。下一个问题是,从BaseExceptionEnvironmentError 派生IntegrityError 是否有意义,这由Python 系统之外可能发生的异常的基类 描述。我知道这有点哲学,但我已经有几个硬件项目,我最终得到了一个非常混乱的错误层次结构。

标签: python exception errno


【解决方案1】:

您知道filename,它是您正在读取和计算 CRC 的文件。对于errnostrerror,我将从libc 中定义的错误列表中进行选择。这就是大多数IOErrors 的原因所在,所以让我们保留这个实现细节以保持一致性。选择哪些值有些随意(并不完全独立于操作系统),我会尝试传达我的问题的一般含义,而不会太具体。

您可以选择其中之一(评论为strerror):

EIO          5  /* I/O error */
EINVAL      22  /* Invalid argument */

对这种“假”的 libc 错误过于具体可能会使人们在错误的轨道上调试问题。

顺便说一句,我咨询了this list 以了解现有的errno

【讨论】:

  • 感谢您的指点 - 我有点希望有一种更结构化的方法,而不是阅读所有错误并选择最适合的错误(以不同类型错误需要不同处理的方式构建,例如,如果出现超时或 CRC 错误,重试是有意义的;对于磁盘已满错误则没有)。供参考:在 Python 中,可以通过键入 [(k,v, os.strerror(k)) for k,v in os.errno.errorcode.items()] 使用 os 模块检索 errnos 列表的描述。
猜你喜欢
  • 2013-04-22
  • 2015-05-13
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2017-05-11
  • 2013-05-09
相关资源
最近更新 更多