很抱歉,我的问题是对还是错,但是我想知道。
class MyCustomException(KeyError):
def __init__(self, *args):
super().__init__(*args)
def method(d):
return d['name']
try:
d = {"value": 1}
method(d)
except MyCustomException:
print('got it')
Aaa,它不起作用!我无法捕捉到异常。这种行为是否违反了SOLID原则,Liskov替代原则?
答案 0 :(得分:1)
您需要明确抛出自定义异常。
class MyCustomException(KeyError):
pass
def method(d):
if not 'name' in d:
raise MyCustomException('name not found!')
else:
return d['name']
try:
d = {"value": 1}
method(d)
except MyCustomException:
print('got it')
Liskov替换本质上是指:如果我有一个类,并且将其子类化,则该子类如果用作父类,则应该能够与父类完全一样地工作。
换句话说,我创建了一个类Baker
,它可以接受白面包和麦面包。如果我将Baker
细分为仅接受白面包的ArtisanBaker
类,那么我现在已经打破了Liskov替代。我不能再简单地将ArtisanBaker
用作Baker
。
答案 1 :(得分:1)
文档section 8.3的引用:
except子句中的类是同一类或其基类,则该异常与异常兼容(但反之则不行-列出派生类的except子句与基类不兼容)。
然而,此代码并没有违反替代原则,因为如果未以不同于基类行为的方式覆盖子类,则子类当然会提供与基类相同的方法,但是您的代码不会做到这一点。
顺便说一句,您不必实现任何方法即可以这种方式“重命名”类。您可以简单地做到这一点:
class MyCustomException(KeyError):
...