【问题标题】:Parent exception types aren't caught when raising child exception types引发子异常类型时不会捕获父异常类型
【发布时间】:2021-02-11 19:14:14
【问题描述】:

如果我定义自己的异常

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,但是异常处理好像不太一致。

【问题讨论】:

  • 问题在于你提出了什么,而不是你except。显示minimal reproducible example 以获得更好的答案。另外,请记住,如果BA 的子类,那么BA,但A 不是B

标签: python exception


【解决方案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(类)而不是它的实际实例?

【讨论】:

  • raise AuthTokenExpired()raise AuthTokenExpired 完全等价
  • 嗯,原来如此。那么一定是其他类型的错字?
  • 就像我在评论中提到的那样,OP 可能正在提高 TokenProblemexcept 是其中一个子类。这行不通
  • 这或多或少是正确的。我有一个错字。我的一种类型没有继承。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2014-11-24
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多