【问题标题】:Usefullness of Python Transformer Exception Pattern?Python Transformer 异常模式的用处?
【发布时间】:2020-10-17 22:10:18
【问题描述】:

我在阅读各种错误处理模式时遇到了所谓的“Transformer”模式。举例如下:

try:
    something()
except SomeError as err:
    logger.warn("...")
    raise DifferentError() from err

您为什么要这样做?为什么不从一开始就使用 DifferentError?需要一个这样的例子可能会有所帮助。

【问题讨论】:

    标签: python python-3.x exception design-patterns except


    【解决方案1】:

    您并不总是能够控制something 会引发什么错误。以这个小功能为例

    def determinant_2by2(matrix: [list]):
        return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
    

    它需要一个 2x2 矩阵并返回它的行列式。但是

    print(
        determinant_2by2([[2,0],[0]])
    )
    

    将产生IndexError。但这并没有详细告诉你它是如何失败的。相反,我们可以这样做

    def determinant_2by2(matrix: [list]):
        try:
            return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
        except IndexError:
            raise Exception('Shape of matrix not 2x2')
        
    
    print(
        determinant_2by2([[2,0],[0]])
    )
    

    清楚地传达出了什么问题

    【讨论】:

      【解决方案2】:

      当您想要引发更具体的错误时,这是​​一种常见的情况。例如,

      class FrobozzParseError(Exception):
          pass
      
      class Frobozz:
          def __init__(self, value):
              try:
                  self.parsed = self._parse(value)
              except IndexError as err:
                  raise FrobozzParseError(err)
      

      现在,调用者可以将 IndexError 和 FrobozzParseError 处理为不同的情况,因此例如忽略特定错误(因为您确切知道可能导致它的原因,并且知道如何恢复),同时允许其他 IndexError 情况仍然导致追溯。

      【讨论】:

        猜你喜欢
        • 2018-01-18
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        相关资源
        最近更新 更多