是否可以在Python中引发内置异常,但使用不同的消息?

时间:2010-02-01 22:36:15

标签: python exception raise built-in

使用自定义文字提出built-in exception是否可以?或者使用自定义文字提出built-in warning

文档内容如下:

  

exception ValueError:当内置操作或函数接收到参数(...)

时引发

隐含内置操作是否会引发ValueError异常?

实际上,我理解创建一个继承自ValueError或Exception的异常类是安全的。但是可以不这样做,并直接引发ValueError(“自定义文本”)?

由于ValueError是内置的,因此与自定义异常类型(类似“ValueErrorSpecificModule”,这不是标准的)相比,引发ValueError(使用自定义文本)可以让用户快速查看所涉及的问题类型。

3 个答案:

答案 0 :(得分:24)

做类似的事情没有任何操作上的错误:

raise ValueError("invalid input encoding")

事实上,当我写一些代码的第一遍时,我经常这样做。这样做的主要问题是代码的客户端在异常处理中很难准确;为了捕获该特定异常,他们必须对他们捕获的异常对象进行字符串匹配,这显然是脆弱和乏味的。因此,最好引入自己的ValueError子类;这仍然可以作为ValueError捕获,但也作为更具体的异常类。

一般的经验法则是,只要您拥有以下代码:

raise ValueError('some problem: %s' % value)

您应该用以下内容替换它:

class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

您可能会说异常类型指定 出错了什么,而消息/属性指定 出错了。

答案 1 :(得分:4)

没关系,我一直这样做。在许多情况下,我发现看到TypeError比MySpecialTypeError更不令人惊讶。

page you linked上,我没有看到“内置”这个词:

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

也许有人看到了你的问题并且已经修好了文件 编辑:您可能已插入ValueError而非TypeError的文档

答案 2 :(得分:2)

完全没问题。

但是,您可能希望创建自己的子类以帮助区分内置异常

例如,如果您的某些内容类似于dict,则可以出于通常的原因引发KeyError,但如果KeyError实际上来自您在实现中使用的基础字典,那该怎么办呢。

提升KeyError的子类使得更容易看到实现中存在错误,而不是关键字不在您的对象中