使用自定义文字提出built-in exception是否可以?或者使用自定义文字提出built-in warning?
文档内容如下:
exception ValueError:当内置操作或函数接收到参数(...)
时引发
隐含仅内置操作是否会引发ValueError异常?
实际上,我理解创建一个继承自ValueError或Exception的异常类是安全的。但是可以不这样做,并直接引发ValueError(“自定义文本”)?
由于ValueError是内置的,因此与自定义异常类型(类似“ValueErrorSpecificModule”,这不是标准的)相比,引发ValueError(使用自定义文本)可以让用户快速查看所涉及的问题类型。
答案 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的子类使得更容易看到实现中存在错误,而不是关键字不在您的对象中