一、全局异常捕获
1 统一接口的返回方式,即便视图函数执行出错,也能捕获异常
2 使用方式
-写一个函数
from rest_framework import status
from rest_framework.views import exception_handler
from rest_framework.response import Response
from django.db import DatabaseError
def common_exception_handler(exc, context):
response = exception_handler(exc, context)
# 在此处补充自定义的异常处理 (可以省略if...elif...else内容,只写一个response=。。。)
if response is None:
view = context['view']
print('[%s]: %s' % (view, exc))
if isinstance(exc, DatabaseError):
response = Response({'code':101,'detail': '数据库错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
elif isinstance(exc,ZeroDivisionError):
response = Response({'code':102,'detail': '除以0的错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
else:
response = Response({'code':999,'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
-在setting中配置
REST_FRAMEWORK = {
'EXCEPTION_HANDLER':'app01.utils.common_exception_handler'
}
二、错误日志
def common_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is None:
# 错误信息记录日志
# <app01.views.StudentApiView object at 0x0000015D4DD44700>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/student_apiview/'>}
print(context['view']) # 哪个视图函数出错
view = context['view']
request = context['request']
print(context['request']) # 当此请求的request对象
print(str(view))
print(request.path)
print(request.method)
print(request.META.get('REMOTE_ADDR'))
# 记录日志(django日志)
# sentry
# print('执行视图函数出错,用户请求的地址是:%s,用户的ip是%s'%(request.path,request['META']['REMOTE_ADDR']))
response = Response({'code': 999, 'detail': str(exc)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
三、利用sentry记录错误日志
原理:
Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建。 Sentry 可以帮助你将 Python 程序的所有 exception 自动记录下来,然后在一个好用的 UI 上呈现和搜索。
错误日志记录平台,异步操作,它跟语言无关,无论是go java 还是python等项目,写个接口连接过去,出了异常,
就会通过网络异步的把错误信息记录到sentry中,还有异常告警等功能,这样很方便。
具体使用:需要安装模块相对复杂,这里不具体说了,可以百度。