阅读内置异常我读到:
所有用户定义的异常也应该从这个类派生"关于异常.
我还看到一个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).
| 归档时间: |
|
| 查看次数: |
11682 次 |
| 最近记录: |