我在python中遇到ValueErrors问题

vd2z7a6w  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(75)

我正在尝试创建一个类"Hippocrates",其中包含一个函数,允许我从给定的文本文档创建字典(文档的内容对我的问题并不重要)。当我试图从字典返回一个值而键在所说的字典中不存在时,我想引发一个ValueError声明"invalid ICD-code"。然后我想让代码继续运行,因为我需要它能够一个接一个地返回值。但由于我引发了ValueError,代码停止了。
我试着把它放在一个try except块中,但是我还不太熟悉它,所以我很挣扎。
以下是我目前掌握的情况:

class Hippocrates:
    def __init__(self, location):
        self.file = open(location, "r")

    def description(self, code):
        answer = {}
        data = self.file.readline()
        while data:
            current = data.split()
            x = current.pop(0)
            current = ' '.join(current)
            answer[x] = answer.get(current, current)
            data = self.file.readline()

        try:
            return answer[code]
        except ValueError:
            print('invalid ICD-code')

当我试图用一个无效的键从它那里得到一个值时,我得到了一个KeyError,我不知道为什么会发生这种情况,因为它应该直接进入一个ValueError。
当我使用一个有效的密钥时,我确实得到了正确的值。
有人能帮我弄明白吗?

qltillow

qltillow1#

如果您使用dict[key],则在键不存在时将引发KeyError
如果您使用dict.get(key),则在密钥不存在时将返回None

class Hippocrates:
    def __init__(self, location):
        self.file = open(location, "r")

    def description(self, code):
        answer = {}
        data = self.file.readline()
        while data:
            current = data.split()
            x = current.pop(0)
            current = ' '.join(current)
            answer[x] = answer.get(current, current)
            data = self.file.readline()

        try:
            return answer[code]
        except KeyError:
            print('invalid ICD-code')
7gs2gvoe

7gs2gvoe2#

对于无效键,应排除KeyError,而不是ValueError
因此只需将try/except更改为:

try:
    return answer[code]
except KeyError:
    print('invalid ICD-code')
bvhaajcl

bvhaajcl3#

你接收到KeyError而不是ValueError的原因是,当你试图获取字典中不存在的键的数据时,Python会引发KeyError,因此,不会引发ValueError,也不会进入你的catch块,简单的解决方法是将你试图捕获的异常类型改为KeyError,然而,使用异常处理作为执行流通常是不好的做法,所以我建议在检索之前检查字典中是否存在键:

if code in answer:
    return answer[code]
else:
    raise ValueError('invalid ICD-code')

顺便说一句,我建议你避免把打开的文件作为类的一个字段。一般来说,把打开文件、读取文件和关闭文件作为一个操作是一个好主意。而且,每次你试图从字典中访问代码时,你的代码都会试图读取文件中的数据,所以这只对第一个代码有效。相反,你应该尝试这样做:

class Hippocrates:
    def __init__(self, location):
        self.codes = {}
        file = open(location, "r")
        data = file.readline()
        while data:
            current = data.split()
            x = current.pop(0)
            current = ' '.join(current)
            self.codes[x] = current
            data = file.readline()
        file.close()

    def description(self, code):
        if code in self.codes:
            return self.codes[code]
        else:
            raise ValueError('invalid ICD-code')

相关问题