python:我该使用ValueError还是创建自己的子类来处理无效字符串?

11 投票
6 回答
7720 浏览
提问于 2025-04-15 17:33

可能重复的问题:
在Python中遇到不合法的参数组合时,我应该抛出哪个异常?

我查了一下Python自带的异常,发现最接近的似乎是ValueError。

根据Python的文档:

异常 ValueError: 当一个内置操作或函数接收到一个类型正确但值不合适的参数时,就会抛出这个异常,而且这种情况并不是由更具体的异常(比如IndexError)来描述的。

我是不是应该创建一个ValueError的子类,比如叫InvalidFormatException?

(我具体的情况是如果一个罗马数字字符串格式不正确,但还有很多其他适用的情况。)

编辑:看来ValueError是个合适的选择,现在的问题是直接使用ValueError好,还是创建一个子类来用。

6 个回答

4

我支持创建一个独特的子类,叫做 InvalidFormatException。

ValueError 这个错误虽然也能用,但它太模糊了。

InvalidFormatException 更具体,直接和你遇到的问题相关。

用户可能会遇到一些情况,他们在做的事情可能会产生这两种错误。他们可能在转换罗马数字,然后再进行一些数学运算。这时候,他们可能需要区分 ValueError 和 InvalidFormatException。

4

这个错误看起来是合理的:

In [1]: int('abc')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

<ipython console> in <module>()

ValueError: invalid literal for int() with base 10: 'abc'
12

ValueError 这个错误类型很适合你遇到的情况。你可以直接使用它,并且记得可以加一个有用的提示信息,这样你就能把它和其他类型的 ValueError 区分开来。

不过,我不建议为了定义一个子类而让代码变得更复杂,除非你有很好的理由只想捕捉这个特定的错误,而不想捕捉其他的 ValueError。很多应用程序都有很多“特殊”的错误情况,但如果每种情况都定义一个子类,代码会很快变得难以维护,任何使用这些功能的人都会因为不断出现意想不到的新错误而感到困惑。

撰写回答