Python触发TypeError: 'NoneType' object is not subscriptable报错求解
Python连续非法输入返回None导致下标访问报错的解决方法
问题根因
- 你当前的
input_control函数只在输入合法的场景下有显式返回值,连续5次输入非法时循环终止后没有返回语句,Python会默认返回None,后续用value[0]/value[1]访问下标自然会触发TypeError,因为None不支持下标操作。
解决方案
方案1:非法场景下返回约定好的固定标识元组
你可以给非法场景设置统一的返回格式,比如返回('EXIT', saldo_actual)这种约定好的标记,后续调用处判断第一个值是不是EXIT就可以做对应逻辑,示例代码片段:
def input_control(max_retry=5, initial_saldo=1500): saldo_actual = initial_saldo retry_count = 0 while retry_count < max_retry: user_input = input("请输入D(存款)/W(取款):").strip().upper() if user_input in ('D', 'W'): return (user_input, saldo_actual) retry_count +=1 print(f"输入非法,剩余可尝试次数:{max_retry - retry_count}") # 连续重试失败后返回约定的退出标识元组 return ('EXIT', saldo_actual) # 调用处判断处理 value = input_control() if value[0] == 'EXIT': print("连续输入错误次数过多,程序退出") else: # 正常调用finance_actions逻辑 finance_actions(*value)
方案2:非法场景下主动抛出可捕获的自定义异常
如果连续输入错误属于异常业务场景,也可以自定义异常抛出,调用处捕获即可:
class InputRetryExceededError(Exception): """连续输入重试次数超过上限自定义异常""" pass def input_control(max_retry=5, initial_saldo=1500): saldo_actual = initial_saldo retry_count = 0 while retry_count < max_retry: user_input = input("请输入D(存款)/W(取款):").strip().upper() if user_input in ('D', 'W'): return (user_input, saldo_actual) retry_count +=1 print(f"输入非法,剩余可尝试次数:{max_retry - retry_count}") raise InputRetryExceededError("连续5次输入非法,程序终止") # 调用处捕获异常 try: value = input_control() finance_actions(*value) except InputRetryExceededError as e: print(e)
注意事项
- 所有分支必须保证返回值格式统一,不要出现合法时返回元组、异常时返回None的情况,从根源避免类型不一致的下标访问错误
- 优先选择和业务逻辑匹配的处理方案:如果连续输入错误是可接受的正常流程分支选方案1,如果属于需要阻断的异常场景选方案2
内容的提问来源于stack exchange,提问作者Janneman
相关产品推荐
相关产品推荐

