类层次结构中的Python错误处理

时间:2015-07-17 11:47:47

标签: python oop design-patterns error-handling

我目前正在使用Python中的子系统,它具有以下结构:

  1. Facade,提供与其他子系统(名称为MyFacade
  2. 进行通信的界面
  3. 引擎(单件) - 接收来自外观的请求并将其发送给" working"课程(MyEngine
  4. 工作模块 - 例如MyFileSystemMyNetworkMyDB等。
  5. 因此,有三个常规级别: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最佳实践和一般设计标准? 可以改进或简化吗?

0 个答案:

没有答案