Python:新的 RangeError 异常应该从 Exception 类还是 ValueError 类派生?

0 投票
1 回答
1173 浏览
提问于 2025-04-18 12:35

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

我有个问题:我应该按照Python文档的建议,从Exception类派生这个新错误,还是从ValueError类派生(我觉得这样更合理)?

这两种选择各有什么好处和坏处?如果我从ValueError类派生,会不会影响未来的开发?

(注意,这个错误不是处理索引超出范围的问题,因为那已经由IndexError处理了。)

谢谢,

1 个回答

2

如果 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
>>>

所以,只有在以下情况下你才应该让 RangeError 继承自 ValueError

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

  2. 你希望人们可以通过捕捉 ValueError 来处理 RangeError

否则,你应该让 RangeError 继承自 Exception,因为:

  1. RangeError 不是一种特定的 ValueError

  2. RangeError 不应该通过捕捉 ValueError 来处理。相反,用户应该明确地使用 except RangeError: 来处理它。

撰写回答