You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python ValueError异常处理问题:Hippocrates类字典键报错排查

问题排查与修复

核心问题分析

  1. 异常捕获不匹配:字典中不存在指定键时,Python会抛出KeyError,但你的代码里except的是ValueError,导致异常无法被捕获。
  2. 文件读取逻辑冗余且不安全:每次调用description方法都会重新读取文件,首次读取后文件指针会停在末尾,后续调用无法读取到内容;同时__init__中直接打开文件未关闭,会造成资源泄漏。
  3. 字典赋值逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:20:38