默认情况下,DRF框架通过内置的 exception_handler 方法,处理了如下异常:

  • django内置异常

    • Http404
    • PermissionDenied
  • DRF框架异常

    • APIException - DRF 框架异常的父类,以下为它的子类

      • NotFound 未找到
      • PermissionDenied 权限拒绝
      • ParseError 解析错误
      • AuthenticationFailed 认证失败
      • NotAuthenticated 尚未认证
      • MethodNotAllowed 请求方式不支持
      • Throttled 超过限流次数
      • ValidationError 校验失败
      • NotAcceptable 要获取的数据格式不支持
  • 如果 exception_handler 方法处理异常成功,则返回一个Response对象,否则返回None

如果发生了上面的这些异常,DRF框架的excaption_handler函数可以自动捕获异常,然后进行处理,返回Response对象。如果不是上面的这些异常,则处理不了,返回None。

那我们在生产环境中,需要把全部异常捕获,输入到日志中。而且我们也不希望给错误页面给用户看到,这时候应该怎么办呢?

这时候可以针对 DRF 框架没有处理的一些特殊的异常,进行全局的异常处理。

示例:

from rest_framework.response import Response
from rest_framework.views import exception_handler def custom_exception_handler(exc, context):
# 先调用DRF默认的 exception_handler 方法, 对异常进行处理,
# 如果处理成功,会返回一个`Response`类型的对象
response = exception_handler(exc, context) if response is None:
# 项目出错了,但DRF框架对出错的异常没有处理,
# 可以在此处对异常进行统一处理,比如:保存出错信息到日志文件
view = context['view'] # 出错的视图
error = '服务器内部错误, %s' % exc
print('%s: %s' % (view, error))
return Response({'detail': error}, status=500) return response

最后还需要在配置文件中声明自定义的异常处理

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'DjangoREST.exceptions.custom_exception_handler'
}

这时候如果有其他异常出现,就可以捕获并且处理啦,也能返回Response对象。

最新文章

  1. TypeScript
  2. EMC与地之重新认识地
  3. (转)listview中常见难题总结
  4. android之merge布局
  5. ubuntu vnc install
  6. VB.NET Shared(共享)和 Static(静态)关键字的区别
  7. windows下fitness python版本安装测试
  8. 详解JDBC连接数据库
  9. 隐藏input的光标
  10. mysql多个TimeStamp设置(转)
  11. parse_str() 函数把查询字符串解析到变量中。
  12. 初识Djiango
  13. 展开被 SpringBoot 玩的日子 《 一 》入门篇
  14. LVS,Keepalived,HAproxy区别与联系
  15. linux 系统调用之文件操作
  16. L2-024. 部落(并查集)*
  17. 使用siege执行压力测试
  18. js第三天知识点 循环
  19. 将一个浮点数转换成人民币读法字符串(java)
  20. mysql保留2位小数字段如何设置 浮点数

热门文章

  1. php自学笔记2
  2. java正则表达式 3 -- 查找
  3. 【转】 cocos2dx 3.x C++搭建protobuf环境
  4. Hibernate关联映射之_一对多
  5. [Leetcode] String to integer atoi 字符串转换成整数
  6. C++——拷贝构造函数说明
  7. HTML5 Canvas圣诞树
  8. RTL2832U+R820T电视棒windows下安装sdr# 以及搭建ADS-B使用VirtualRadar看飞机的教程
  9. Codeforces Round #478 C. Valhalla Siege
  10. javascript简易下拉菜单效果