用两个参数引发异常

时间:2017-02-20 16:29:04

标签: python python-3.x exception-handling

再次问候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上进行很好的对话。

2 个答案:

答案 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(或其他参数)。如果格式化异常,真实异常数据将丢失:您只有文本表示。