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

Fra*_*eil 12 python exception

可能重复:
python:我应该使用ValueError还是创建自己的子类来处理无效字符串?

阅读内置异常我读到:

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

我还看到一个ValueError,它说:

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

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

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

pho*_*oji 10

我认为一般的想法是这样的: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 内置库ValueError在某些情况下确实是子类(例如UnicodeError).