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

Эти вопросы могут быть некорректны теоретически, но хотелось бы знать, есть ли обходной путь.

Давайте рассмотрим следующий пример:

def my_function():
    try:
        print("before the exception occurs")
        raise ValueError
    except ValueError:
        print('exception found')

    print("after the exception occurs")


if __name__ == "__main__":
    my_function()

если вы печатаете в stdout, выводдолжно быть следующим:

before the exception occurs
exception found
after the exception occurs

Однако, если вы используете декоратор для перехвата исключения, как показано ниже:

from functools import wraps


def decorator(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except ValueError:
        print('exception found')

  return wrapper


@decorator
def my_exception_function():
  print("before the exception occurs")

  raise ValueError

  print("after the exception occurs")


if __name__ == "__main__":
  my_exception_function()

остальная часть функции после возникновения исключения не будет выполненакак показано ниже:

before the exception occurs
exception found

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

1 Ответ

2 голосов
/ 19 мая 2019

Давайте попробуем встроить my_exception_func в декоратор.

from functools import wraps


def decorator(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    try:
        print("before the exception occurs")
        raise ValueError
        print("after the exception occurs")
    except ValueError:
        print('exception found')

  return wrapper

Так что теперь поток управления должен быть более четким:

  • Печать 'перед исключением'
  • Возникло исключение
  • Перейти кexcept block
  • return

Из-за исключения печать «после исключения» никогда не достигается.

Использование блока try-исключения для перехватаисключение, но затем выполнение кода после точки исключения на самом деле не работает.Вам нужно будет выделить точно , где может произойти исключение, и обернуть только эту часть в блок try-Кроме.

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