首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中引发内置异常,但使用不同的消息可以吗?

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

Stack Overflow用户
提问于 2010-02-02 06:36:15
回答 3查看 5.4K关注 0票数 25

是否可以使用自定义文本引发built-in exception?或者引发一个带有自定义文本的built-in warning

文档内容如下:

exception ValueError:内置操作或函数接收参数(…)时引发

这是否意味着只有内置操作才会引发ValueError异常?

在实践中,我知道创建从ValueError或Exception继承的exception类是安全的。但是,不这样做,直接引发一个ValueError(“自定义文本”)可以吗?

由于ValueError是内置的,因此与自定义异常类型(类似于"ValueErrorSpecificModule",这不是标准的)相比,引发ValueError (带有自定义文本)允许用户快速查看涉及的问题类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-02 07:20:23

这样做在操作上没有任何错误:

代码语言:javascript
复制
raise ValueError("invalid input encoding")

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

一般的经验法则是,只要你有像这样的代码:

代码语言:javascript
复制
raise ValueError('some problem: %s' % value)

您可能应该将其替换为以下内容:

代码语言:javascript
复制
class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

您可能会说,异常类型指定了哪里出了问题,而消息/属性则指定了它是如何出错的。

票数 28
EN

Stack Overflow用户

发布于 2010-02-02 06:44:28

完全没问题。

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

例如,如果你有一个像dict一样工作的东西,你可以出于通常的原因引发一个KeyError,但是如果KeyError真的来自于你在实现中使用的底层字典呢?

引发KeyError的子类可以更容易地看到实现中存在错误,而不是键不在您的对象中

票数 3
EN

Stack Overflow用户

发布于 2010-02-02 06:48:45

这很好,我一直都在这么做。我发现在很多情况下看到TypeError并不像MySpecialTypeError那么令人惊讶。

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

代码语言:javascript
复制
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文档

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2180577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档