是否可以使用自定义文本引发built-in exception?或者引发一个带有自定义文本的built-in warning?
文档内容如下:
exception ValueError:内置操作或函数接收参数(…)时引发
这是否意味着只有内置操作才会引发ValueError异常?
在实践中,我知道创建从ValueError或Exception继承的exception类是安全的。但是,不这样做,直接引发一个ValueError(“自定义文本”)可以吗?
由于ValueError是内置的,因此与自定义异常类型(类似于"ValueErrorSpecificModule",这不是标准的)相比,引发ValueError (带有自定义文本)允许用户快速查看涉及的问题类型。
发布于 2010-02-02 07:20:23
这样做在操作上没有任何错误:
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)
您可能会说,异常类型指定了哪里出了问题,而消息/属性则指定了它是如何出错的。
发布于 2010-02-02 06:44:28
完全没问题。
但是,您可能希望创建自己的子类,以帮助区分内置异常
例如,如果你有一个像dict
一样工作的东西,你可以出于通常的原因引发一个KeyError,但是如果KeyError真的来自于你在实现中使用的底层字典呢?
引发KeyError的子类可以更容易地看到实现中存在错误,而不是键不在您的对象中
发布于 2010-02-02 06:48:45
这很好,我一直都在这么做。我发现在很多情况下看到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.
也许有人看到了你的问题,并且已经修复了文档。
EDIT:看起来您插入的可能是ValueError
文档,而不是TypeError
文档
https://stackoverflow.com/questions/2180577
复制相似问题