在Python中引发IOError异常的最佳实践

4 投票
1 回答
14211 浏览
提问于 2025-04-17 22:27

我正在写一个小的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异常,使它能和其他错误(比如磁盘已满文件未找到等)很好地结合在一起呢?

1 个回答

4

你知道filename吧,它就是你正在读取并计算CRC的那个文件。至于errnostrerror,我会从libc里定义的错误列表中选择。这是大多数IOErrors的来源,所以我们保持这个实现细节的一致性。选择哪些值有点随意(而且并不是完全和操作系统无关),我会尽量传达我问题的一般含义,而不去过于具体。

你可以选择这些中的一个(注释会是strerror):

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

如果对这种“假”的libc错误过于具体,可能会让人调试问题时走上错误的道路。

顺便说一下,我参考了这个列表来查找现有的errno

撰写回答