我目前正在使用Python中的子系统,它具有以下结构:
MyFacade
)MyEngine
)MyFileSystem
,MyNetwork
,MyDB
等。因此,有三个常规级别:Facade
- Engine
- Worker
。如果在某处发生错误,Facade
必须获取它并将其显示给客户端,并且应用程序不得崩溃。
在Python中对所有三个抽象级别组织错误处理错误的最佳实践方法是什么?如果在最低级别(Worker
)发生错误,我应该抓住它,还是返回None
/ False
?在上层应该做些什么来提供必要的功能并避免违反DRY,SRP等?
假设我在worker_method
级别上有一个函数/方法Worker
。在这个方法中,我执行了许多操作。
其中大多数都很关键 - 如果失败,我想停止执行worker_method
并向Engine
报告失败。
但是,我在worker_method
内有一个我不关心的电话,它被允许失败。它看起来应该是这样的:
def worker_method(self):
"""..."""
critical_call()
another_critical_call()
try:
dummy_call()
except Exception, e:
# caught non-critical exception
logger.log_error(e.message)
"""..."""
考虑Engine
中调用上述方法的方法:
def engine_method(self):
try:
some_engine_internal_stuff()
"""..."""
data_from_worker = worker_instance.worker_method()
"""..."""
self.set_last_error(None)
return engine_operating(data_from_worker)
except Exception, e:
self.set_last_error(e.message)
return None
考虑Facade
中调用上述方法的方法:
def facade_method(self):
try:
"""..."""
data_from_engine = engine_instance.engine_method()
if data_from_engine is None and engine_instance.get_last_error() is not None:
return facade_prepare_data_to_return_to_client(engine_instance.get_last_error())
return facade_prepare_data_to_return_to_client(data_from_engine)
except Exception, e:
return facade_prepare_data_to_return_to_client(e.message)
在这种情况下,Engine
实例适用于"防弹"模式并防止异常接近Facade
级别。失败由返回值指示。
在Facade
级别,我们再次使用try / catch,因为尽管Engine
是"防弹" Facade
方法中仍然存在例外情况,我们必须抓住它们以防止应用程序崩溃。
此模型是否满足Python最佳实践和一般设计标准? 可以改进或简化吗?