我有类似的层次结构和类似的代码:
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
的{{1}}个函数中使用cmd_x
个对象和例外进行操作。
基本上,我需要一个处理常见Frontend
类型的地方来筹集BackendException
。例如:
FrontendException
这将在每个class Frontend:
def cmd_a():
try:
BackendRequest().exec()
except BackendException as e:
raise FrontendException()
函数中重复出现!太难看了!并且它与cmd_x
事物一起运作!我想删除重复的异常处理。
有任何建议吗?
Backend
编辑:好的,是的,我知道,我不需要创建很多类来构建简单的API。但是,让我们看看结果中我需要什么:
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())
此管理器需要访问HTTP REST服务才能执行每个命令。所以,如果我在REST请求期间收到错误,我将需要引发异常APIManagerException - 我不能离开class APIManager:
def cmd_a(): ...
def cmd_b(): ...
,因为APIManager用户不知道是什么{{ 1}},如果他将错误的raw pycurl exception
作为pycurl
的参数,他将会被pycurl error
混淆。
因此,我需要针对一些常见案例提出信息性异常。让它成为一个例外 - ID
。但我不希望每次在每个命令中重复cmd_x
阻止每个pycurl请求。实际上,我想在APIManagerException
中处理一些错误,而不是解析pycurl错误。
答案 0 :(得分:0)
您可以创建一个包装所有前端调用的装饰器,捕获BackendExceptions
,并在抛出它们时引发FrontendException
。 (老实说,虽然不清楚为什么Frontend
和Backend
是类而不是一组函数。)见下文:
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()