Python ValueError异常处理问题:Hippocrates类字典键报错排查
问题排查与修复
核心问题分析
- 异常捕获不匹配:字典中不存在指定键时,Python会抛出
KeyError,但你的代码里except的是ValueError,导致异常无法被捕获。 - 文件读取逻辑冗余且不安全:每次调用
description方法都会重新读取文件,首次读取后文件指针会停在末尾,后续调用无法读取到内容;同时__init__中直接打开文件未关闭,会造成资源泄漏。 - 字典赋值逻辑错误:
answer[x] = answer.get(current, current)完全搞反了键值对应关系,应该是将提取的ICD编码x作为键,对应的描述文本current作为值。
修复后的代码
class Hippocrates: def __init__(self, location): self.icd_dict = {} # 使用with语句自动管理文件资源,避免泄漏 with open(location, "r") as file: for line in file: line = line.strip() if not line: continue # 跳过空行 parts = line.split(maxsplit=1) # 只按第一个空格分割,避免描述里的空格被拆分 code = parts[0] description = parts[1] if len(parts) > 1 else "" self.icd_dict[code] = description def description(self, code): try: return self.icd_dict[code] except KeyError: # 抛出指定提示的ValueError,或者根据需求改为返回提示字符串 raise ValueError("invalid ICD-code") from None
关键修复点说明
- 初始化时加载字典:在
__init__中一次性读取文件并生成字典,后续调用description直接使用已加载的字典,提升效率且避免文件指针问题。 - 安全文件操作:用
with语句打开文件,代码块结束后自动关闭文件,避免资源泄漏。 - 正确分割行内容:使用
split(maxsplit=1)确保只按第一个空格分割,避免描述文本中的空格被拆分,保证键值提取准确。 - 异常捕获修正:捕获
KeyError后,抛出符合需求的ValueError,并使用from None隐藏原异常上下文,让提示更简洁。
使用示例
# 实例化类 hippo = Hippocrates("icd_codes.txt") try: print(hippo.description("A00")) # 有效键,返回对应描述 print(hippo.description("XXX")) # 无效键,抛出ValueError except ValueError as e: print(e) # 输出: invalid ICD-code # 后续代码可以正常运行 print("程序继续执行...")
内容的提问来源于stack exchange,提问作者Techtix
相关产品推荐
相关产品推荐

