exctptions.py
from rest_framework.views import exception_handler
from .response import APIResponse # 封装的Response
from .logger import get_logger # 封装的日志
import traceback # 详细的报错模块
logger = get_logger('django') # 封装的日志调用
def custom_exception_handler(exc, context):
'''
:param exc: 报错原因:list index out of range
:param context: 报错详情:{'view': <home.views.TestView object at 0x7f857020cc70>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/testView/'>}
:return:
'''
response = exception_handler(exc, context)
res = APIResponse(code=999, msg=response.data)
if response is None:
# 出了异常
res = APIResponse(code=999, msg='系统错误') # 给前端看的
logger.error('服务器错误->错误原因:%s; 出错的view是:%s; 请求地址是:%s; 详细信息:%s' % (
str(exc),
str(context['view']),
str(context['request'].get_full_path()),
traceback.format_exc() # 最详细的报错信息
)) # 记录日志
return res
settings.py
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 自定义的文件路径, # 全局异常配置
}
调用
from rest_framework.exceptions import ValidationError
# 全局异常 和 raise ValidationError() 都会被捕捉