Почему множественное унаследованное исключение не перехватывает родительское исключение? - PullRequest
0 голосов
/ 20 июня 2020

Я предполагаю, что следующий код предполагает печать ("CustomExceptionALL"), но этого никогда не произойдет, если мы вызовем CustomException1, CustomException2 или CustomException3, пока работает CustomExceptionALL. Почему except CustomExceptionALL не ловит CustomException3?

class CustomException1(Exception):
    pass

class CustomException2(Exception):
    pass

class CustomException3(Exception):
    pass

class CustomExceptionALL(CustomException1, CustomException2, CustomException3):
    pass

try:
    raise CustomException3
except CustomExceptionALL as e:
    print("CustomExceptionALL")
except Exception as e:
    print(e)

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Скорее наоборот: вы вызываете производное исключение, а затем перехватываете его с помощью родительского класса. Например:

class Brexit(Exception):
    pass

class Covid(Exception):
    pass

class DoubleWhammy(Brexit, Covid):
    pass

try:
    raise DoubleWhammy
except Brexit as e:
    print("Brexit")
except Exception as e:
    print(e)
1 голос
/ 20 июня 2020

Потому что вы можете перехватить только подклассы указанного исключения. В вашем случае эти два неверны:

isinstance(CustomException3(), CustomExceptionALL)  # False
issubclass(CustomException3, CustomExceptionALL)  # False

(потому что вы пытаетесь поймать CustomExceptionALL, но CustomException3 не CustomExceptionALL, а наоборот)

Вместо этого вы можете использовать кортеж классов:

CustomExceptionALL = (CustomException1, CustomException2, CustomException3)

isinstance(CustomException3(), CustomExceptionALL)  # True
issubclass(CustomException3, CustomExceptionALL)  # True

try:
    raise CustomException3
except CustomExceptionALL as e:
    print("CustomExceptionALL")  # This prints
except Exception as e:
    print(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...