如何在Python中指出无效参数?

时间:2011-02-25 02:39:34

标签: python exception

  

可能重复:
  python: Should I use ValueError or create my own subclass to handle invalid strings?

阅读Built-in Exceptions我读到了:

  

所有用户定义的异常也应该从这个类派生“关于异常。

我还看到ValueError说:

  

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

如果我想为无效参数引发异常(相当于Ruby的ArgumentError),我该怎么办?我应该直接提出ValueError,还是最好用我自己的意图揭示名称来继承ValueError?

就我而言,我接受一个关键参数,但是我想限制键中的字符集,这样只接受/\A[\w.]+\Z/(Perl / Ruby正则表达式)。

2 个答案:

答案 0 :(得分:9)

我认为一般的想法是这样的:ValueError几乎总是表示某种客户端错误(其中'client'表示程序员使用你的界面)。 Python中有两种高级异常类型:

  • 其他常用功能代码的罕见情况;客户不应该受到责备

  • 使用错误,如果某些接口使用不当,或者通过一系列接口调用,系统已达到不一致状态;时间责怪客户

在我看来,对于第一种情况,创建异常类层次结构是有意义的,以允许客户端代码对非常见情况下的操作进行细粒度控制。

在第二种情况下,ValueError就是一个例子,你告诉客户他们做错了什么。细粒度的异常层次结构在这里并不重要,因为客户端代码可能应该被修复以做正确的事情(例如,首先传递正确的参数类型)。

TL; DR:只需使用ValueError,但请提供有用的消息(例如raise ValueError("I'm afraid I can't let you do that, Dave. -HAL 9000")。除非你真的希望有人想要抓住SubClassError而不是其他ValueError,否则不要继承。

如上所述,正如您所提到的,Python built-in library在某些情况下确实是子类ValueError(例如UnicodeError)。

答案 1 :(得分:1)

ValueError似乎很好地涵盖了你的情况。