python - Python 中处理自定义异常的正确方法是什么?

标签 python django

根据我读到的内容,EAFP(请求宽恕比请求许可更容易)是 Python 中一种可接受的编码风格,实际上在很多情况下都是推荐的。

我的问题是,自定义异常何时会变得太多。假设我们有一个狗旅馆的 Web 应用程序,其结构如下:

- controllers
    -- dogs.py (Receives REST requests)
- services
    -- dogs.py (Connects to a DB and a third party API to retrieve dog breed information)
    -- validator.py

现在三个请求示例:

  1. 有人想要创造一只新狗,但提供了无效信息。因此验证器有一个返回 False 的 is_valid_dog 方法。
  2. 有人发出 GET 请求来检索有关某只不存在的狗的信息。狗服务访问了数据库,但什么也没找到。
  3. 用户想要了解狗的品种信息,该服务访问了第三方 API,但已关闭(获得 500 状态)。

处理这种类型的流量的最佳方法是什么?

  1. 在第一种情况下,当 is_valid_dog 返回 False 时我是否应该引发异常?或者向 Controller 返回 None/False 以便它可以将其映射到 400 状态代码?
  2. 我应该返回 None 以便 Controller 将返回值映射到 404 吗?
  3. 我是否应该捕获异常并使用消息引发自定义 ThirdPartyAPIException,并且 Controller 必须知道如何处理该异常?

我很好奇何时返回特定值或仅在不同层引发异常,以便 Controller 可以返回最终状态。一般来说,哪里是处理这些异常/流程的最佳位置。

最佳答案

您应该遵循 DRF 的方法,它是 RESTful django api 的事实标准。看一下DRF的源码:https://github.com/encode/django-rest-framework/blob/master/rest_framework/exceptions.py .

  1. 创建默认的 ValidationError 异常,根据您的上下文自定义每个错误。如果引发异常,则返回 400 状态代码;

  2. 如果返回 None,则引发 NotFound 异常,并带有 404 状态代码;

  3. 我会坚持捕获异常并显示 503 代码“服务不可用”。

查看 APIException 类以了解异常的流程以及这些错误的响应。

关于python - Python 中处理自定义异常的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51603164/

相关文章:

python - get_absolute_url 问题。错误捕获 ViewDoesNotExist

django - 如何在 Django 中设置基本 URL

python flask : Get database rows as dictionary

python - Django表单数据回复与显示

python - 检查日期字符串是否为 UTC 格式

python - 将 matplotlib 绘图轴设置为数据框列名称

django - 如何在python3 manage.py shell中以表格形式打印Django查询集

启用 grappelli 后,django adminplus 链接消失

python - pandas 读取未分隔的文本文件到数据框

Python Pandas 更新数据框列类型