Python代码TypeError未触发、except块变量提示未定义问题排查
问题原因分析
- 问题1(非数字输入触发ValueError而非TypeError)的原因:
int()函数尝试将非数字格式的字符串转为整数时,本身就会抛出ValueError,该错误会直接进入对应的except分支,根本不会执行到你后续判断类型的代码行。- 你的类型判断逻辑本身存在错误:
type(day) != int()中int()是创建了一个值为0的整数实例,正确的类型判断写法应为type(day) is not int;且只要int(input())执行成功,day和month必然是int类型,该判断完全冗余没有作用。 - 你把「日期/月份超出合法范围」的自定义异常也抛出为
ValueError,和int转换失败的系统异常混淆,也会导致异常分支逻辑混乱。
- 问题2(PyCharm提示
month、day可能未定义)的原因:
如果第一个int(input())执行就报错(比如第一次输入就是非数字),此时day还没赋值成功,month更是完全没有被定义,你在except块中直接访问这两个变量会触发NameError,IDE的提示是为了规避该风险。
修复方案
- 拆分异常类型:单独捕获
int()转换失败的ValueError用于提示输入非数字的场景,给自定义的范围异常加标识区分,避免异常混淆。 - 调整变量访问逻辑:只有输入转换成功后才执行范围校验和计算逻辑,确保所有用到
month、day的场景下变量都已经完成初始化。 - 删除冗余的类型判断逻辑,以及不合理的
ZeroDivisionError抛出逻辑(月份为0属于非法月份,不应挪用除零错误的异常类型)。
修正后可正常运行的代码如下:
try: # 单独处理输入转换,捕获非数字输入错误 day = int(input()) month = int(input()) except ValueError: print("Please do not enter any string as input") else: # 输入转换成功后再做范围校验,此时day、month必然已定义 try: if month < 1 or month > 12: # 给自定义异常加标识区分类型 raise ValueError("invalid_month") if day < 1 or day > 31: raise ValueError("invalid_day") # 业务计算逻辑 if day < 10: distance = 5 + (day * 2) / month else: distance = 3 + (day / month) print(distance, "Kilometres") except ValueError as e: err_type = str(e) if err_type == "invalid_month": print(month, "is not a valid month") elif err_type == "invalid_day": print(day, 'is not a valid day of any month')
内容的提问来源于stack exchange,提问作者kirihadinomoyet
相关产品推荐
相关产品推荐

