【发布时间】:2020-08-07 18:52:51
【问题描述】:
背景
在 Python 中,如果您引发异常 from None,则可以抑制 Exception 的上下文。 PEP 409 描述了其背后的基本原理。有时您只想显示一个有意义的(自定义)异常。使用 PEP 415 时,实现会随着以下参数发生变化:
这个方案 [来自 PEP 409] 的主要问题是它使 __cause__ 的角色复杂化。 __cause__ 应该指出异常的原因,而不是是否应该打印 __context__。 __cause__ 的这种用法在未来也不容易扩展。例如,有一天我们可能希望允许程序员选择将打印 __context__ 和 __cause__ 中的哪一个。
问题
PEP 419 讨论了未来的用例。现在是否有任何有效的用例(Python 3.3+)可以使用替代异常原因?例如,考虑以下代码:
class CustomError(BaseException):
pass
class StupidError(BaseException):
def __init__(self, message='This is just a stupid error.'):
super(StupidError, self).__init__(message)
self.message = message
try:
value = int('a')
except Exception:
raise CustomError('Custom error message') from StupidError
输出:
StupidError: This is just a stupid error.
The above exception was the direct cause of the following exception:
Traceback (most recent call last): (...)
CustomError: Custom error message
是否存在您想要隐藏ValueError 但显示StupidError 的实际用例?我的意思是您可以在StupidError 中提供一些相关信息,而这些信息仅在ValueError 中不存在?也许我只是在想这整件事。
【问题讨论】:
-
作为一个非常小众的例子。在我的上一家公司,我们有一个错误会导致相同的最终结果,但可能是由几件事引起的。所以就最终用户而言,我们会有一个统一的结局,但就内部实践/日志记录而言,我们会做不同的事情。我们使用 other_error 的错误来处理它。我敢肯定这不是最好的例子,但我在生产中实际看到的唯一一个。
标签: python python-3.x exception