编写一个装饰器,捕获不同异常并做出处理

问题遇到的现象和发生背景

最近学了装饰器 我试图写一个装饰器 当它捕获到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()