装饰器未正常返回函数:计算器代码无效输入报错排查与修复
问题分析与修复方案
存在的核心问题
- 非数字输入直接崩溃:
menu()函数里直接把用户输入转成int,如果输入字母、符号等非整数内容,会触发ValueError,程序直接报错退出,此时valid_input装饰器根本没机会介入处理。 - 无效输入后无返回值:
valid_input装饰器的wrapper在输入不在0-4范围时,只打印提示但没有返回值,导致主循环里print(f"Result: {result}")会输出Result: None,逻辑不严谨。 - 退出函数依赖环境:
calc()里的quit()是Python交互式环境的专属函数,在脚本环境中用sys.exit()更通用可靠。
修复后的完整代码
import sys def valid_input(func): def wrapper(x): if x in [0, 1, 2, 3, 4]: return func(x) else: print("Invalid Input") return None # 添加明确返回值 return wrapper def show_operation(func): def wrapper(x, y): operation = func.__name__ print(f"Performing {operation}") return func(x, y) return wrapper @valid_input def calc(op): if op == 0: print("Quitting calculator...") sys.exit() # 替换为通用的sys.exit() else: x = get_operand() y = get_operand() if op == 1: return add(x, y) elif op == 2: return sub(x, y) elif op == 3: return mult(x, y) elif op == 4: return div(x, y) def menu(): while True: print("Enter an operation:") print("1 Add\n2 Subtract\n3 Multiply\n4 Divide\n0 Quit") user_input = input(">") try: return int(user_input) except ValueError: print("请输入有效数字(0-4)") # 捕获非数字输入异常,提示后重新输入 def get_operand(): while True: try: return int(input("Enter an operand:")) except ValueError: print("请输入有效的整数Operand") # 同样给Operand添加异常处理,避免输入非数字崩溃 @show_operation def add(x, y): return x + y @show_operation def sub(x, y): return x - y @show_operation def mult(x, y): return x * y @show_operation def div(x, y): return x / y while True: op = menu() result = calc(op) if result is not None: # 只有当result不为None时才打印结果 print(f"Result: {result}\n")
关键修复点说明
- 给menu和get_operand添加异常捕获:用
try-except包裹int()转换,遇到非数字输入时提示用户并重新获取输入,避免程序崩溃。 - 给valid_input的wrapper添加返回值:无效输入时返回
None,主循环通过判断result是否为None决定是否打印结果,避免输出Result: None。 - 替换quit()为sys.exit():保证在所有Python环境中都能正常退出程序。
内容的提问来源于stack exchange,提问作者MessatsuX
相关产品推荐
相关产品推荐

