异常处理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', }