Python:是否应该从Exception类或ValueError类派生一个新的RangeError异常?

时间:2014-07-09 00:28:26

标签: python exception exception-handling error-handling

我想为我的Python模块创建一个新的异常:RangeError。当值超出预期范围时,我会返回此错误。

我的问题是:我应该从Exception类派生新错误(如Python文档所建议的那样),还是应该从ValueError类派生它(这对我来说更有意义)?

一种选择或另一种选择有哪些好处和缺点?如果我从ValueError类派生出来,我是否会破坏未来的发展?

(请注意,这不适用于索引超出范围,因为它已经由IndexError处理。)

谢谢,

1 个答案:

答案 0 :(得分:1)

如果RangeError继承自ValueError,那么您可以通过捕捉ValueError来抓住它:

>>> class RangeError(ValueError):
...     pass
...
>>> try:
...     raise RangeError
... except ValueError:
...     print("handler for ValueError")
...
handler for ValueError
>>>
>>> try:
...     raise RangeError
... except ValueError:
...     print("handler for ValueError")
... except RangeError:  # Ignored because except ValueError: was reached first
...     print("handler for RangeError")
...
handler for ValueError
>>>

因此,您应该只从ValueError if:

继承
  1. RangeError是一种特定的ValueError。换句话说,它是后者的进一步分类,就像ZeroDivisionError ArithmeticError一样。

  2. 您希望人们能够通过捕捉RangeError来抓住ValueError

  3. 否则,您应该继承Exception,因为:

    1. RangeError 特定种类ValueError

    2. RangeError应该抓住ValueError 。相反,用户应该通过except RangeError:明确处理它。