请问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
这应该很容易吧,比如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'>
值错误
except Exception as e
Exception 就是异常类型啊
你直接用异常基类来接收异常,那不管什么异常都进入一个分支里了
一个try可以跟多个except
你可以在前面加其它类型先捕获一波,用Exception 兜底