Поймать исключение по __cause__ - PullRequest
0 голосов
/ 01 апреля 2019

Python 3 позволяет вызывать исключения из других исключений, например:

try:
  raise CustomException()
except CustomException as e:
  try:
    raise TypeError() from e
  except TypeError as e:
    print(type(e.__cause__))

Экземпляр CustomException хранится в атрибуте __cause__ объекта исключения.Приведенный выше код должен напечатать CustomException.

Есть ли способ перехватить исходное исключение вместо вновь созданного?

try:
  raise CustomException()
except CustomException as e:
  try:
    raise TypeError() from e
  except CustomException as e:
    print(type(e)) # should reach here

Переопределение __subclasscheck__ не работает, так как я неУ меня нет доступа к экземпляру, и я не могу указать, что CustomException является подклассом всех классов или причина class .

Есть ли способчтобы заставить Питона думать, что исключение, которое мы ловим, относится к типу __cause__?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Если у вас есть контроль над сгенерированным исключением, вы можете сделать его подклассом сгенерированного исключения:

try:
   raise TypeError()
except TypeError as e:
   try:
      class CustomException(TypeError.__class__):
         pass
      raise CustomException() from e
   except TypeError as e:
      print(type(e))  # Reaches here

Тем не менее, механизм перехвата и перерисовки предназначен для сокрытия того, что было исходным исключением, чтобы последующий код не зависел от деталей реализации.

1 голос
/ 01 апреля 2019

Простое решение: перехват всех исключений и требуемый фильтр:

try:
    raise ZeroDivisionError()
except ZeroDivisionError as e:
    try:
        raise TypeError() from e
    except Exception as ex:
        if type(ex.__cause__) is ZeroDivisionError:
            print('ZeroDivisionError')
        else:
            raise  # re-raise exception if it has different __cause__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...