问题
为什么使用ABCMeta.register
创建的抽象Exception
的虚拟子类在except
子句下无法匹配?
背景
我想确保我使用的包抛出的异常被转换为MyException
,这样导入我的模块的代码可以使用except MyException:
捕获我模块抛出的任何异常,而不是使用except Exception
,这样他们就不必依赖于一个实现细节(即我正在使用第三方包)。
示例
为此,我尝试使用抽象基类将OtherException
注册为MyException
:
# Tested with python-3.6
from abc import ABC
class MyException(Exception, ABC):
pass
class OtherException(Exception):
"""Other exception I can't change"""
pass
MyException.register(OtherException)
assert issubclass(OtherException, MyException) # passes
try:
raise OtherException("Some OtherException")
except MyException:
print("Caught MyException")
except Exception as e:
print("Caught Exception: {}".format(e))
断言通过(如预期所示),但异常掉落到第二个块中:
Caught Exception: Some OtherException
__subclasses__
。相反,这是Python3中一个长期存在的错误。请参见被接受的答案。 - Mike McCoy