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

#python #exception #logging #decorator

#python #исключение #ведение журнала #декоратор

Вопрос:

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

 import asyncio
import logging
from functools import wraps

log = logging.getLogger(__name__)


def logger(func):
    async def exception_handler(*arg, **kwargs):
        try:
            await func(*arg, **kwargs)
        except Exception as err:
            log.error(f"Exception occured: {err}")
            # Send log to external system
    return exception_handler


@logger
async def bad_division(dividend, divisors):
    for divisor in divisors:
        print(dividend / divisor)
    print("How do I continue?")


if __name__ == '__main__':
    dividend  = 10
    divisors = [2, 0, 4, 6, 8, 0]
    asyncio.run(bad_division(dividend, divisors))
 

Возможно ли продолжить перебор for loop без переноса print(dividend / divisor) try catch ?

Комментарии:

1. Похоже на задание для контекстного менеджера, например with log_exceptions(): print(dividend / divisor)

2. вы должны использовать try/except или if divisor != 0: с этой единственной строкой. Но вы не можете сделать это с помощью декоратора. Декоратор не может обернуть одну строку внутри функции.