Python自定义异常未生效,输入字符串时无法被except分支捕获
问题原因
你的代码无法按预期捕获自定义异常,是三个核心逻辑错误导致的:
- 你把输入判断的业务逻辑直接写在了类定义的顶层代码块里,这部分代码是Python加载类的时候就立刻执行的,根本不是你写
obj = b()实例化对象的时候才运行。 int()转换非数字字符串失败时,Python原生抛出的是内置ValueError异常,和你自定义的error类没有任何继承关系,你写的except error分支本来就接不住这个系统原生异常。- 你从来没有在输入非法的场景主动抛出自己的
error异常,只有你手动写raise error的位置才会触发这个自定义异常,内置类型转换失败不会自动抛出你定义的异常。 - 你原代码里写的
else: raise error是永远不会执行的死代码:年龄转成整数后,要么大于等于18,要么小于18,不存在第三种数值情况。
修正方法
把输入判断的逻辑放到类的实例方法里(比如放到__init__方法中,实例化对象时会自动执行),在整数转换失败捕获到ValueError的时候,主动抛出你自定义的error异常,这样就能精准进入自定义异常的捕获分支。
修正后可正常运行的代码:
class error(Exception): pass class b(error): def __init__(self): try: age_input = input("Enter your age:\n>>") # 捕获整数转换失败的原生异常,主动抛出自定义异常 try: age = int(age_input) except ValueError: raise error() if age >= 18: print("You are Eligible for Voting") else: print("You are not Eligible for Voting") except error: print("Invalid input") print("Enter a number as your age") obj = b()
测试效果
- 输入非数字内容
sdsd时输出:
Enter your age: >>sdsd Invalid input Enter a number as your age
- 输入合法年龄
20时输出:
Enter your age: >>20 You are Eligible for Voting
- 输入低于投票年龄的数值
16时输出:
Enter your age: >>16 You are not Eligible for Voting
补充说明:Python类定义块里的代码属于类构建阶段的执行逻辑,仅在类被加载时执行一次,不要把和实例相关、需要重复运行的业务逻辑直接写在类的顶层缩进位置。
内容的提问来源于stack exchange,提问作者Shubham-Misal
相关产品推荐
相关产品推荐

