You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:33:29