9

Python文档except说:

对于带有表达式的 except 子句,该表达式被求值,如果结果对象与异常“兼容”,则该子句匹配异常。如果对象是异常对象的类或基类,则对象与异常兼容,[...]

为什么不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
>>> 
4

2 回答 2

4

简单的答案可能是没有人考虑过。一个更复杂的答案是没有人考虑它,因为很难做到这一点,因为这意味着在处理异常时执行潜在的任意 Python 代码,并且它的价值值得怀疑。Python 中的异常类通常是非常简单的类,用功能重载它们通常是错误的。很难想象有什么案例可供它咨询__instancecheck__。如果你有这样的情况(有或没有补丁),提交一个错误,有人可能会捡起它。

于 2010-10-01T22:42:06.820 回答
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来确定. Metaclass PEP更详细地讨论了这一点。SomethingSomeType

于 2010-10-01T23:21:05.633 回答