异常处理Exceptions

异常处理

  在定义 API 接口时,当视图继承了 APIView 或其子类之后,如果视图中出现了未处理的异常,都会调用 DRF 框架的默认异常处理函数进行处理。

1. 默认异常处理

默认DRF框架使用 rest_framework.views 模块下的 exception_handler 函数进行异常处理。

DRF框架的默认异常处理函数设置如下:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

exception_handler函数可以处理以下异常,处理之后,会给客户端返回对应的响应:

  • APIException 所有异常的父类
  • ParseError 解析错误
  • AuthenticationFailed 认证失败
  • NotAuthenticated 尚未认证
  • PermissionDenied 权限决绝
  • NotFound 未找到
  • MethodNotAllowed 请求方式不支持
  • NotAcceptable 要获取的数据格式不支持
  • Throttled 超过限流次数
  • ValidationError 校验失败
  • Http404 资源不存在

2. 自定义异常处理

1)在 booktest/utils/exceptions.py 文件中自定义异常处理函数如下:

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from rest_framework.response import Response

# 注:DatabaseError是Django中所有数据库错误的父类
from django.db import DatabaseError

def exception_handler(exc, context):
    # 先调用DRF框架的默认异常处理函数
    response = drf_exception_handler(exc, context)

    if response is None:
        # 补充数据库的异常处理
        if isinstance(exc, DatabaseError):
            response = Response({'detail': '数据库错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response

2)在 drf_demo/settings.py 配置文件中修改DRF框架的异常处理函数配置项

REST_FRAMEWORK = {
    # 此处设置使用自定义的异常处理函数
    'EXCEPTION_HANDLER': 'booktest.utils.exceptions.exception_handler',
}