Reputation: 332
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
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
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