Python中的SOLID

时间:2019-07-31 20:32:53

标签: python exception solid-principles

很抱歉,我的问题是对还是错,但是我想知道。

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替代原则?

2 个答案:

答案 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):
    ...