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

Posted

技术标签:

【中文标题】python:我应该使用 ValueError 还是创建自己的子类来处理无效字符串? [复制]【英文标题】:python: Should I use ValueError or create my own subclass to handle invalid strings? [duplicate] 【发布时间】:2010-12-31 19:27:18 【问题描述】:

可能重复:Which exception should I raise on bad/illegal argument combinations in Python?

我查看了 python 的内置异常,唯一看起来很接近的是 ValueError。

来自 python 文档:

异常值错误: 当内置操作或函数接收到具有正确类型但值不适当的参数时引发,并且该情况没有由更精确的异常(如 IndexError)描述。

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

(我的特殊情况是罗马数字字符串的格式不正确,但还有许多其他适用的情况。)

编辑:看来 ValueError 是正确的选择,现在的问题是是直接使用 ValueError 还是继承它。

【问题讨论】:

【参考方案1】:

是的。 ;-) ValueError 听起来确实是最适用的内置函数,并且使用它的子类,您似乎正在做最好的事情。这也是 f.i. '%q' % 1 会加注。

【讨论】:

【参考方案2】:

ValueError 似乎合乎逻辑:

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

<ipython console> in <module>()

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

【讨论】:

【参考方案3】:

对于这种情况,我也支持 ValueError。我的 2 美分。

【讨论】:

【参考方案4】:

ValueError 非常适合您的情况。就这样吧,记住你可以指定一个有用的消息作为参数,让你把它与其他类型的 ValueError 区分开来。

我不会通过定义子类来使代码更复杂,但是,除非我有充分的理由想要只捕获那个特定的错误但避免捕获任何其他 ValueErrors。许多应用程序都有几十个“特殊”错误条件,但如果它们还定义了每个案例的子类,那么代码很快就会变得无法维护,任何尝试使用这些例程的人都会经常对意外的新异常感到惊讶。

【讨论】:

这是最好的答案(请记住,您可以提供一些特定的文本,但可以提供一些例外,并且它会随引用提供);然而,根本不需要太多的理由来推动我创建一个子类——换句话说,一个极低但仍然存在的障碍。 @Roger,我同意,关于该消息的要点。我已经编辑提到了这个有用的想法。 请记住,消息用于人工检查,sublcassing 用于机器检查。子类化比从exc_info 中提取消息要好,因为您必须先捕获ValueError,然后再捕获exc_info 等等。如果您认为(如果问题甚至出现,那么答案几乎总是“是”)稍后在您的程序中的某个地方,您需要区分发生了哪种特定于域的错误,然后将 ValueError 子类化。【参考方案5】:

我投票赞成创建一个独特的子类 InvalidFormatException。

ValueError,虽然是真的,但很模糊。

InvalidFormatException 更具体,与您的问题直接相关。

用户可能会遇到他们正在做的事情可能会产生任何错误的情况。他们可能会转换罗马数字,然后做一些数学运算。他们可能需要区分 ValueError 和 InvalidFormatException。

【讨论】:

是的,我总是会提出一个自定义的、特定的例外情况……这不会有什么坏处,但以后可能会对您有所帮助。【参考方案6】:

实际上,这取决于您是否希望(或需要)该特定异常独立于在调用代码期间可能发生的其他 ValueErrors 可捕获。这还取决于您是您的代码的唯一使用者还是供其他人使用;在后一种情况下,如果您定义一些他们可以检查的高级库特定异常,这可能对这些人有所帮助。

【讨论】:

以上是关于python:我应该使用 ValueError 还是创建自己的子类来处理无效字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的ValueError,数组中的索引数不匹配

ValueError:pytorch 中的“str”python 维度太多

我应该为不存在的文件参数引发 ValueError 或 OSError 吗?

ValueError at /(未设置必需的参数名称)

ValueError:python2.7 的 zip 解压的值太多

理解 ValueError:python 中的“无效数字”