drf—— 全局异常

一、全局异常捕获

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中,还有异常告警等功能,这样很方便。

具体使用:需要安装模块相对复杂,这里不具体说了,可以百度。
原文地址:https://www.cnblogs.com/guojieying/p/13963800.html