except
的{{3}}说:
对于带有。的except子句 表达,表达式 评估,并且该条款匹配 如果生成的对象是异常 与此例外的“兼容”。一个 object与异常兼容 如果它是异常对象的类或基类,[...]
为什么except
不使用isinstance
而不是比较基类?这阻止了使用__instancecheck__
覆盖实例检查。
修改
我可以理解,这不存在的原因之一是没有人考虑过它。但有什么理由不能实现吗?
修改
Python 3.2a中的Shell会话显示尝试使用__subclasscheck__
不起作用:
>>> class MyType(type): __subclasscheck__ = lambda cls, other_cls: True
>>> class O(Exception, metaclass=MyType): pass
>>> issubclass(3, O)
0: True
>>> issubclass(int, O)
1: True
>>> try:
... 1/0
... except O:
... print('Success')
Traceback (most recent call last):
File "<pyshell#4>", line 2, in <module>
1/0
ZeroDivisionError: division by zero
>>>
答案 0 :(得分:3)
简单的答案可能是没有人考虑过它。更复杂的答案是没人会考虑它,因为很难做到这一点,因为它意味着在处理异常时执行可能任意的Python代码,并且它具有可疑的价值。 Python中的异常类通常是非常简单的类,并且使用功能重载它们通常是一个错误。很难想象让它咨询__instancecheck__
的情况。如果您有这种情况(有或没有补丁),请提交一个错误,有人可能会提起它。
答案 1 :(得分:1)
但这有什么理由吗? 不应该实施?
你能给出一个有用的例子吗?
执行此操作时:
class SomeMeta(type):
def __subclasscheck__(cls, sub):
print (cls, sub)
return True
class Something(Exception):
pass
class SomeType(Exception):
__metaclass__ = SomeMeta
try:
raise Something()
except SomeType, e:
pass
# prints (<class '__main__.SomeType'>, <class '__main__.Something'>)
Python在__subclasscheck__
的元类上调用SomeType
来确定Something
是SomeType
的子类。 Metaclass PEP更详细地讨论了这一点。