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

如何创建自定义异常修改继承方法的打印信息?

问题分析与解决方案

你的代码核心问题

  1. 异常类职责错配:你把meow方法写在了MyException里,但MyException继承的是Exception而非Cat,调用super().meow()会直接报错(因为Exception根本没这个方法)。异常类的作用是标记异常类型,不是实现业务方法。
  2. 逻辑位置错误:你要修改的是VeryBadCat的叫声行为,却把逻辑塞进了异常类,完全偏离了子类重写父类方法的设计思路。
  3. 条件判断无效:父类Cat的meow方法只有打印动作,没有返回值(默认返回None),所以if super().meow()永远为假,逻辑根本走不通。

修正后的代码

class Cat:
    def __init__(self, name):
        self.name = name
    
    def meow(self):
        print("meow")

class GoodCat(Cat):
    def __init__(self, name):
         super().__init__(name)

    def meow(self):     
        print("purr purr meow")
    
class BadCat(Cat):
    def __init__(self, name):
        super().__init__(name)

    def meow(self):
        print("hiss")
    
class VeryBadCat(Cat):
    def __init__(self, name):
        super().__init__(name)
    
    def meow(self):
        try:
            # 直接抛出自定义异常,触发目标输出
            raise MyException("Nope, scratch scratch")
        except MyException as e:
            print(e)
        finally:
            print("Program Stop")

class MyException(Exception):
    # 自定义异常只需要继承Exception,无需额外方法
    pass

# 测试验证
if __name__ == "__main__":
    tom = VeryBadCat("Tom")
    tom.meow()

代码解释

  1. 简化异常类:MyException只保留基础的自定义异常结构,专注于标记异常类型,不掺和业务逻辑。
  2. 把逻辑放回子类:在VeryBadCat的meow方法里实现异常流程,符合继承体系的设计——子类重写父类方法实现自定义行为。
  3. 直接触发目标效果:如果你的需求就是让VeryBadCat输出指定内容和结束提示,直接在try块抛出异常即可,捕获后打印异常信息,finally块确保"Program Stop"一定会输出。

如果你想模拟「调用父类meow失败才触发异常」的场景,可以修改VeryBadCat的meow方法:

def meow(self):
    try:
        super().meow()  # 先执行父类的meow,打印"meow"
        # 模拟父类方法执行失败的判断(比如返回值不符合预期)
        raise MyException("Nope, scratch scratch")
    except MyException as e:
        print(e)
    finally:
        print("Program Stop")

这种情况下调用会先输出父类的"meow",再输出异常内容和结束提示。

内容的提问来源于stack exchange,提问作者JnooriRS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:21:30