0

我得到了类似的层次结构和类似的代码:

class FrontendException:
    pass    
class BackendException:
    pass
class BackendRequest:
    def exec():
        raise BackendException()

class Frontend:
    def cmd_a():
        BackendRequest().exec()

    def cmd_b():
        BackendRequest().exec()

目标是使开发人员能够Frontendcmd_x.Frontend

基本上,我需要一个地方来处理常见BackendException类型,来提高FrontendException. 例如:

class Frontend:
    def cmd_a():
        try:
            BackendRequest().exec()
        except BackendException as e:
            raise FrontendException()

这将在每个cmd_x函数中重复!太丑了!它与Backend事物一起运作!我想删除重复的异常处理。 有什么建议么?

顺便说一句,我的解决方案,但我也觉得它很难看,所以在你尝试向我建议一些东西后查看它。也许你会就我的解决方案向我提出一些建议。

class BaseFrontend:
    def exec_request(req):
        try:
            return req.exec()
        except BackendException as e:
            raise FrontendException
class Frontend(BaseFrontend):
    def cmd_a():
        result self.exec_request(BackendRequest())
    def cmd_b():
        result self.exec_request(BackendRequest())

编辑:好的,是的,我知道,我不需要创建很多类来构建简单的 API。但是,让我们看看我需要的结果:

class APIManager:
    def cmd_a(): ...
    def cmd_b(): ...

此管理器需要访问 HTTP REST 服务才能执行每个命令。所以,如果我在 REST 请求期间遇到错误,我需要引发异常 APIManagerException - 我不能离开raw pycurl exception,因为 APIManager 用户不知道是什么,如果他会给出错误,pycurl他会混淆的论点。因此,我需要针对一些常见情况提出信息异常。让它只是一个例外 - 。但我不想每次在每个命令中对每个 pycurl 请求都重复阻止。事实上,我想处理一些错误,而不是解析 pycurl 错误。pycurl errorIDcmd_xAPIManagerExceptiontry...exceptcommands(functions cmd_x)

4

1 回答 1

0

您可以创建一个装饰器来包装所有前端调用、捕获BackendExceptions和引发(FrontendException如果它们被抛出)。(不过,老实说,尚不清楚为什么FrontendBackend是类而不是一组函数。)见下文:

class FrontendException:
    pass    
class BackendException:
    pass
class BackendRequest:
    def exec():
        raise BackendException()

class Frontend:

    def back_raiser(func):
        def wrapped(*args, **kwargs):
            try:
                func(*args, **kwargs)
            except BackendException:
                raise FrontendException
        return wrapped

    @back_raiser
    def cmd_a():
        BackendRequest().exec()

    @back_raiser
    def cmd_b():
        BackendRequest().exec()
于 2012-12-19T22:24:34.607 回答