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

Я поиграл с иерархией исключений и понял, что подкласс исключений с несколькими родителями не обнаружен.

Например:

class Error1(Exception): 
    pass

class Error2(Exception): 
    pass

class MixedError(Error1, Error2): 
    pass

try:
    print('before 1')
    raise Error2()
    print('after 1')

except MixedError:
    print('Caught it with a mixin 1!')

except Exception:
    print('Big catcher here 1!')

Это печатает:

до 1

Большой ловец здесь 1!

Почему исключение с несколькими родителями не перехвачено?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы неправильно понимаете, как работает exceptions. Исключения кэшируются родительским исключением, а не дочерними:

class Error1(Exception):
    pass

class Error2(Exception):
    pass

class MixedError(Error1, Error2):
    pass

try:
    print('before 1')
    raise MixedError()
    print('after 1')

except Error2:
    print('Caught it with a Error2!')

except Exception:
    print('Big catcher here 1!')

печать:

before 1
Caught it with a Error2!
0 голосов
/ 02 мая 2018

Вы никогда не поднимаете MixedError. Также обратите внимание, что родительские классы ничего не знают о дочерних классах, поэтому, когда вы вызываете Error1 или Error2, вы поднимаете ошибку, используя __str__ из этого конкретного класса:

class Error1(Exception): 
   pass

class Error2(Exception): 
   pass

class MixedError(Error1, Error2): 
   pass

try:
   raise MixedError('Error here')
except MixedError:
   print("caught 'MixedError'")

Выход:

caught 'MixedError'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...