Python交互式计算器自定义异常处理问题:修复ValueError报错
修复后的Python交互式计算器代码
# 自定义异常类 class FormulaError(Exception): """提示非法运算符""" pass class MissingElement(Exception): """提示输入元素数量错误""" pass class InvalidValueError(Exception): """提示非数值输入""" pass def calculate(): user_input = input("请输入计算式(如 3 + 5):").strip() elements = user_input.split() # 检查元素数量是否符合要求 if len(elements) != 3: raise MissingElement("输入格式错误!请按照「数值 运算符 数值」的格式输入") num1_str, op, num2_str = elements # 转换数值时捕获系统异常,抛出自定义异常 try: num1 = float(num1_str) num2 = float(num2_str) except ValueError: raise InvalidValueError("输入包含非数值内容!请输入有效的数字") # 校验运算符合法性 valid_ops = {"+", "-", "*", "/"} if op not in valid_ops: raise FormulaError(f"非法运算符「{op}」!仅支持 +、-、*、/") # 执行计算逻辑 if op == "+": result = num1 + num2 elif op == "-": result = num1 - num2 elif op == "*": result = num1 * num2 elif op == "/": if num2 == 0: print("错误:除数不能为0") return result = num1 / num2 print(f"计算结果:{result}") # 主交互循环,处理异常并允许重新输入 while True: try: calculate() again = input("是否继续计算?(y/n):").strip().lower() if again != "y": break except (FormulaError, MissingElement, InvalidValueError) as e: print(f"错误:{e}") print("请重新输入。")
关键修复说明
- 解决命名冲突:将自定义的「非数值输入」异常从
ValueError改名为InvalidValueError,避免和Python内置ValueError混淆,这是原代码中自定义异常不生效的核心原因。 - 主动捕获数值转换异常:在尝试将输入字符串转为数值时,捕获系统原生
ValueError,随即抛出自定义的InvalidValueError,确保用户看到自定义提示。 - 前置元素数量检查:拆分输入后立刻校验元素数量是否为3,不符合则抛出
MissingElement异常,保证该异常逻辑正常触发。 - 统一异常处理流程:在主循环中集中捕获所有自定义异常,提示错误后允许用户重新输入,维持交互的连贯性。
验证场景
- 输入
2 + a:触发InvalidValueError,提示「错误:输入包含非数值内容!请输入有效的数字」 - 输入
2 +:触发MissingElement,提示「错误:输入格式错误!请按照「数值 运算符 数值」的格式输入」 - 输入
2 $ 5:触发FormulaError,提示「错误:非法运算符「$」!仅支持 +、-、*、/」
内容的提问来源于stack exchange,提问作者i_amgeek112
相关产品推荐
相关产品推荐

