再次问候StackOverflow社区,
我正在读一本同事写的图书馆,发现了一些我不太了解他们想要做的事情。但也许这是我在Python语法方面缺少的东西。
class SampleClass:
def some_function(self) -> None:
try:
self.do_something()
except CustomException as e:
raise DifferentExceptionClass("Could not do something", e)
# The previous line is the cause of bewilderment.
def do_something(self) -> None:
raise CustomException("Tried to do something and failed.")
我已经读过,raise可以接受参数,但这似乎会以一个元组作为值引发DifferentExceptionClass异常。我的同事在这里做了什么和做raise DifferentExeptionClass("Could not do something. {}".format(e))
之类的事情之间有什么区别?以他的方式提出例外是否有好处?
函数调用some_function()的输出是:
test = SampleClass()
test.some_function()
Traceback (most recent call last):
File "<input>", line 4, in some_function
File "<input>", line 10, in do_something
CustomException: Tried to do something and failed.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 6, in some_function
DifferentExceptionClass: ('Could not do something', CustomException('Tried to do something and failed.',))
编辑:同事无法评论。他们很久以前也写过这个图书馆,可能不记得&#34;心情&#34;当他们写这篇文章的时候他们就在。我认为如果其他人看到类似的实施,它也会在SO上进行很好的对话。
答案 0 :(得分:1)
这样做肯定有好处。您链接异常并将该链作为信息提供给用户,而不是提供最新创建的异常。
当然,您的同事可以通过使用Python为此提供的语法以更好的方式完成它。 raise exc from raised_exc
语法用于在引发另一个异常后引发异常:
except CustomException as e:
raise DifferentExceptionClass("Could not do something") from e
并导致e
(此处引发的异常CustomException
)存储为最新异常的__cause__
属性(DifferentExceptionClass
此处),如果您需要偷看它。
如果在raise
处理程序中使用except
(如代码段中所示),则先前的异常(e
)已隐式存储< / em>作为__context__
属性。所以,将它作为参数传递,除了将{1}}元组中的异常存储在其中之外没有做任何其他事情。
答案 1 :(得分:1)
我已经读过,raise可以接受参数,但这似乎引发了一个异常,并以元组为值。
Exception
实际上也是类。确实在某个地方你会找到类似的东西:
class DifferentExceptionClass(Exception):
def __init__(self,message,innerException):
# ...
pass
所以你打电话给一个构造函数。如何处理参数取决于异常。消息可能是使用内部异常格式化的,但它也可能完全不同。
优点是例如可以相应地存储,检查和处理innerException
(或其他参数)。如果格式化异常,真实异常数据将丢失:您只有文本表示。