Loading

drf 异常处理

异常处理

20.1 异常示例

视图

class ExceptionView(APIView):
    def get(self, request):
        a = 1/0
        return Response({"message": "ok"})

路由

from django.urls import path
from . import views

urlpatterns = [
    path('exc/',views.ExceptionView.as_view())
]

访问结果

x2TATH.png

返回的是一个页面,而不是json数据,前端是无法处理的,如果要返回json数据,那么就要进行try,但是每次在可能出现的异常的地方都要try有点麻烦,所以我们要自定义异常。

20.2 自定义异常处理类

opt/exceptions.py

from rest_framework.views import exception_handler
from rest_framework.response import Response

def my_exception_handler(exc, context):
    """
    自定义异常函数
    :exc 本次发生的异常对象
    :context 本次发生异常时的上下文环境信息,为字典类型
    """
    response = exception_handler(exc, context)
    if response is None:  # 如果为None说明drf自己无法处理
        if isinstance(exc, ZeroDivisionError):
            response = Response({"detail": "0不能作为除数或分母"})
    return response

配置全局异常处理类

REST_FRAMEWORK = {

  	......
    # 自定义异常
    'EXCEPTION_HANDLER': 'opt.exceptions.my_exception_handler',
}

访问效果

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "detail": "0不能作为除数或分母"
}
posted @ 2022-10-24 17:36  minqiliang  阅读(42)  评论(0编辑  收藏  举报
-->