如何创建自定义异常修改继承方法的打印信息?
问题分析与解决方案
你的代码核心问题
- 异常类职责错配:你把
meow方法写在了MyException里,但MyException继承的是Exception而非Cat,调用super().meow()会直接报错(因为Exception根本没这个方法)。异常类的作用是标记异常类型,不是实现业务方法。 - 逻辑位置错误:你要修改的是
VeryBadCat的叫声行为,却把逻辑塞进了异常类,完全偏离了子类重写父类方法的设计思路。 - 条件判断无效:父类
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()
代码解释
- 简化异常类:
MyException只保留基础的自定义异常结构,专注于标记异常类型,不掺和业务逻辑。 - 把逻辑放回子类:在
VeryBadCat的meow方法里实现异常流程,符合继承体系的设计——子类重写父类方法实现自定义行为。 - 直接触发目标效果:如果你的需求就是让
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
相关产品推荐
相关产品推荐

