引发子异常类型时不会捕获父异常类型

时间:2021-02-11 19:14:14

标签: python exception

如果我定义自己的例外

class AuthTokenExpired(Exception):
    pass
    
class TokenNotInDatabase(Exception):
    pass
    
class NoTokenInRequest(Exception):
    pass

然后我可以通过说来抓住他们中的任何一个

try:
    proc_that_raises()
except (AuthTokenExpired, TokenNotInDatabase, NoTokenInRequest):
    handle_exception()

为了聪明,我创建了一个父异常类并从中派生所有这些

class TokenProblem(Exception):
    pass

class AuthTokenExpired(TokenProblem):
    pass
        
class TokenNotInDatabase(TokenProblem):
    pass
        
class NoTokenInRequest(TokenProblem):
    pass

如果我这样做,那么 except TokenProblem 不会在 TokenNotInDatabase 上触发。为什么这不起作用? TokenNotInDatabase 是一个TokenProblem,但是异常处理好像不太一致。

1 个答案:

答案 0 :(得分:1)

以下是异常继承工作原理的简单演示:

>>> class TokenProblem(Exception):
...     pass
...
>>> class AuthTokenExpired(TokenProblem):
...     pass
...
>>> try:
...     raise AuthTokenExpired()
... except TokenProblem:
...     print("looks like I caught it")
...
looks like I caught it

也许在您的 proc_that_raises 中,您试图提升 AuthTokenExpired(类)而不是它的实际实例?

相关问题