【问题标题】: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 情况仍然导致追溯。