[英]I'm having trouble importing ThreadedWebsocketManager in Python
[英]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.