Prcc321 2021-11-04 14:40 采纳率: 88.9%
浏览 79
已结题

请问Python捕获到Exception时怎么获取具体异常类型

请问Python捕获到Exception时怎么获取具体异常类型?
我现在有一个装饰器,来捕获异常写入日志,然后根据异常类型决定是否需要写入详细信息的日志,但我使用repr()获取的是字符串,只能截取内容来判断
请问可以直接获取到异常类型吗

def error_log():
    """
    异常捕获日记记录装饰器
    """

    def decorator(func):

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 运行程序
            try:
                return func(*args, **kwargs)
            # 捕获异常
            except Exception as e:

                """查询异常类型是否需要记录详细信息"""
                # 记录详细信息默认True
                is_exc_info = True
                # 需要记录详细信息的异常类型
                is_exc_info_dict = {
                    'TestDataError',
                    'DataBaseConnectError'
                }
                if repr(e).split('(')[0] in is_exc_info_dict:
                    is_exc_info = True

                """记录日志"""
                # 记录异常日志
                ErrorLog().create_logger.exception(
                    msg=f'{func.__name__}:{e}',  # 日志内容 -> 方法名称:异常信息
                    exc_info=is_exc_info,  # 详细信息
                    extra={'status': 'Exception'}  # 额外参数属性
                )

                """抛出异常"""
                raise e

        return wrapper

    return decorator


  • 写回答

2条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2021-11-04 14:56
    关注

    这应该很容易吧,比如type函数,或者isinstance函数,都可以。示例代码:

    >>> import random
    >>> try:
        r = random.random()
        if r < 0.33:
            raise ValueError('值错误')
        elif r < 0.66:
            raise KeyError('键错误')
        else:
            raise AttributeError('属性错误')
    except Exception as e:
        print(type(e))
        if isinstance(e, ValueError):
            print('值错误')
        elif isinstance(e, KeyError):
            print('键错误')
        elif isinstance(e, AttributeError):
            print('属性错误')
        else:
            print('其他错误')
    
            
    <class 'ValueError'>
    值错误
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月12日
  • 已采纳回答 11月4日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 求红米或者任意工作安卓机ro,ot之后劫c ,h ,i摄像头, 实现无人直播瞒过抖音直播助手的教程, 或者远程 协助也可以。
  • ¥15 elasticsearch
  • ¥15 uniapp的uni-datetime-picker组件在ios端不适配
  • ¥15 前端 uniapp App端在离线状态如何使用modbus 连接手机蓝牙进行读写操控机器?
  • ¥15 SQL语句根据字段自动生成行
  • ¥500 “掌声响起来”软件(不确定性人工智能)
  • ¥500 我要找大模型一体机产品手册和应用案例
  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期