from functools import wraps↵
↵
def retry(max_attempts=3, exceptions=(Exception,)):↵
def decorator(func):↵
@wraps(func)↵
def wrapper(*args, **kwargs):↵
for attempt in range(1, max_attempts + 1):↵
try:↵
return func(*args, **kwargs)↵
except exceptions as e:↵
if attempt == max_attempts:↵
raise↵
print(f"Attempt {attempt} failed: {e}")↵
return wrapper↵
return decorator↵
↵
@retry(max_attempts=2, exceptions=(ValueError,))↵
def risky_operation(x):↵
if x < 0:↵
raise ValueError("Negative!")↵
return x * 2↵
↵
print(risky_operation(5))