我得到了类似的层次结构和类似的代码:
class FrontendException:
pass
class BackendException:
pass
class BackendRequest:
def exec():
raise BackendException()
class Frontend:
def cmd_a():
BackendRequest().exec()
def cmd_b():
BackendRequest().exec()
目标是使开发人员能够Frontend
在cmd_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 error
ID
cmd_x
APIManagerException
try...except
commands(functions cmd_x)