繁体   English   中英

我在 python 中遇到 ValueErrors 问题

[英]i'm having trouble with ValueErrors in python

我正在尝试创建一个类“Hippocrates”,其中包含一个函数,允许我从给定的文本文档创建一个字典(文档的内容对我的问题并不重要)。 当我尝试从字典中返回一个值并且该字典中不存在该键时,我想提出一个 ValueError 说明“无效的 ICD 代码”。 然后我希望代码继续运行,因为我需要它能够一个接一个地返回值,但是由于我引发了 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。

当我使用有效密钥时,我确实得到了正确的值。

有人可以帮我解决这个问题吗?

您应该将无效键的 KeyError 排除在外,而不是 ValueError

所以只需将 try/except 更改为:

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

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

您收到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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM