处理异常时避免重复代码

时间:2015-08-22 13:07:17

标签: python oop dry anonymous-function code-duplication

对于我的应用程序,我需要使用两种略有不同的算法来持久化实体:     

def persistRandomAlias(self, alias):
    self.em.persist(alias)
    try:
        self.em.flush()
    except DBALException as e:
        if e.previous.code != 23000:
            raise e
        self.reloadEM()

        self.persistRandomAlias(alias)



def persistCustomAlias(self, alias):
    self.em.persist(alias)
    try:
        self.em.flush()
    except DBALException as e:
        if e.previous.code != 23000:
            raise e
        self.reloadEM()

        existing = self.findByNaturalKey(alias.name)
        if existing != alias:
            raise DuplicateNameException('The requested name is already taken', e)

它们之间的区别在于负责异常处理的代码的一部分。我考虑将公共代码放在一个方法中,其余的操作在一个接受异常对象的函数中传递,如下所示:     

def persistAlias(self, alias, exHandler):
    self.em.persist(alias)
    try:
        self.em.flush()
    except DBALException as e:
        if e.previous.code != 23000:
            raise e
        self.reloadEM()

        exHandler(e)

def persistRandomAlias(self, alias):
    self.persistAlias(alias, lambda e: self.persistRandomAlias(alias))            

def persistCustomAlias(self, alias):
    def exHandler(e):
        existing = self.findByNaturalKey(alias.name)
        if existing != alias:
            raise DuplicateNameException('The requested name is already taken', e)

    self.persistAlias(alias, exHandler)

但是,我不确定将未使用的参数传递给函数是否正确。

我还考虑过将公共代码重构为抽象方法对象类,如下所示:     

def execute(self):
    self.em.persist(alias)
    try:
        self.em.flush()
    except DBALException as e:
        if e.previous.code != 23000:
            raise e
        self.reloadEM()
        self.e = e

        self.handleE()

handleE()将在实现execute()方法的类的子类中实现,它可以访问异常对象,具体取决于实现。

我应该选择其中一个想法来处理代码重复吗?哪一个更好?你建议一个更好的解决方案吗?

0 个答案:

没有答案