BlazingLeaf12
BlazingLeaf12

Reputation: 332

How do I make a decorator to wrap an async function with a try except statement?

Let's say I have an async function like this:

async def foobar(argOne, argTwo, argThree):
   print(argOne, argTwo, argThree)

I want to make a decorator and use it on this function in a way that it wraps the above code in a try except statement like this:

try:
   print(argOne, argTwo, argThree)
except:
   print('Something went wrong.)

Is there any way to do this?

Upvotes: 11

Views: 6070

Answers (2)

S4eed3sm
S4eed3sm

Reputation: 1478

because wrapper called first, we should also define it as a async function: async def wrap(*arg, **kwargs):

import asyncio

def decorator(f):
    async def wrapper(*arg, **kwargs):
        try:
            await f(*arg, **kwargs)
        except Exception as e:
            print('Something went wrong.', e)
    return wrapper


@decorator
async def foobar(argOne, argTwo, argThree):
    print(argOne, argTwo, argThree)
    await asyncio.sleep(1)

asyncio.run(foobar("a", "b", "c"))

Upvotes: 13

Paul Cornelius
Paul Cornelius

Reputation: 10946

def deco(coro1):
    async def coro2(argOne, argTwo, argThree):
        try:
            await coro1(argOne, argTwo, argThree)
        except:
            print('Something went wrong.')
    return coro2

@deco
async def foobar(argOne, argTwo, argThree):
    print(argOne, argTwo, argThree)

Upvotes: 1

Related Questions