最近学了装饰器 我试图写一个装饰器 当它捕获到sqlalchemy异常 会进行事务回滚session.rollback() 当它捕获到循环异常 会跳出本次循环do continue 当它捕获到其他异常 直接打印错误
以下是我写的代码
# 异常捕获装饰器
def catch_exc(session):
def decorator(func):
def wrapper(*args, **kw):
try:
return func(*args, **kw)
# 捕获到sqlalchemy异常,进行事务回滚session.rollback()
except sqlalchemy_exc.SQLAlchemyError as e:
print('调用 %s()时数据库会话出错,进行事务回滚:' % func.__name__)
err = traceback.format_exc()
print('错误为:%s' % err)
session.rollback()
print('事务回滚成功')
# 捕获到循环异常,跳出本次循环do continue
except loop_err as e:
print('调用 %s()时某次循环出错:' % func.__name__)
err = traceback.format_exc()
print('错误为:%s' % err)
# do continue ,帮我跳出本次循环,比如说1 2 3 4 ,2出错,就是 1 错误 3 4,下面有个测试函数,谢谢
print('已跳出该次循环')
# 捕获到其他异常,直接打印错误
except:
print('调用 %s()出错:' % func.__name__)
err = traceback.format_exc()
print('错误为:%s' % err)
return wrapper
return decorator
@catch_exc(my_session)
def fuc_1(user_name):
# 期望输出0,1,错误,3,4,5......
for i in range(10):
if i == 2:
print(5 / 0)
print(i)
print('%s使用了%s' % (user_name, fuc_1.__name__))
我使用的是sqlalchemy框架,不知道这样写能否回退成功。也不知道有没有一种方法可以捕获循环异常然后跳出本次循环。希望可以整体优化一下我的代码(写太啰嗦了感觉),然后实现这些功能。
你这段代码就可以实现,没问题的
按照这样根据判断异常类型 去执行不同操作 更加优雅
def Error_Handler(func):
def Inner_Function(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as ex:
message, _ = type(ex).__name__, ex.args # ex。args是错误的详细信息
if message == "TypeError": # 这里是你的指定异常
print("比如回退代码")
elif message == "IndexError": # 这里是你的指定异常
print("比如你的U循环异常")
else:
print("都不是你想要的异常走这里")
return Inner_Function
@Error_Handler
def Mean(a, b):
print((a + b) / 2)
@Error_Handler
def Square(sq):
u = [1]
print(u[2])
@Error_Handler
def success():
print("Ok hello")
Square("three")
Mean("six", "five")
success()