REST framework提供了自定义异常处理,我们可以自定义的方式来编写异常处理函数。例如我们想在要创建一个自定义异常函数,
- 注意:这个函数,我们保存到当前主应用中[注意在实际工作中,我们可以设置一个单独的独立的公共目录来保存这种公共的函数/工具/类库]。
- 在项目目录去创建一个 exceptions.py 文件,用来写异常类,然后添加到配置文件中
示例代码:
from rest_framework.views import exception_handler as drf_exception_handler
from django.db import DatabaseError
from rest_framework.response import Response
from rest_framework import status
def custom_exception_handler(exc, context):
"""
自定义异常处理函数
:param exc: 异常对象,本次发生的异常对象
:param context: 字典,异常出现时的执行上下文环境
:return:
"""
# 先让drf进行异常判断,如果是属于drf组件定义好的异常,那么会返回一个有错误信息的响应数据
# 如果不是属于drf组件定义好的异常,会返回一个None
response = drf_exception_handler(exc, context)
# 判断response对象是否为None
if response is None:
"""出现drf不能处理的异常"""
if isinstance(exc, DatabaseError):
view = context.get("view")
print('数据库报错,[%s]: %s' % (view, exc))
return Response({"detail":"服务器内部错误!"}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
if isinstance(exc, ZeroDivisionError):
view = context.get("view")
print("0不能作为除数! [%s]: %s" % (view, exc) )
return Response({"detail":"服务器内部错误!"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
写号异常了后,在配置文件settings.py中去配置该类
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDLER': 'drfdemo.exceptions.custom_exception_handler', #写该类的路径
}
#如果不配置异常类,会采用默认的方式,如下:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}
REST framework定义的异常
- APIException drf中所有异常的父类
- ParseError 解析错误
- AuthenticationFailed 认证失败
- NotAuthenticated 尚未认证
- PermissionDenied 权限受限
- NotFound 未找到
- MethodNotAllowed 请求方式不支持
- NotAcceptable 要获取的数据格式不支持
- Throttled 超过限流次数
- ValidationError 校验失败
也就是说,很多的没有在上面列出来的异常,就需要我们在自定义异常中自己处理了。