首页 > 解决方案 > 在 Python 中处理自定义异常的正确方法是什么?

问题描述

根据我读过的内容,EAFP(Easier to Ask for Forgiveness than Permission)是 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 时引发异常吗?还是将 None/False 返回给控制器,以便它可以将其映射到 400 状态代码?
  2. 我应该返回 None 以便控制器将返回值映射到 404?
  3. 我是否应该捕获异常并使用消息引发自定义 ThirdPartyAPIException 并且控制器必须知道如何处理?

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

标签: pythondjango

解决方案


您应该遵循 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以了解异常的流程和这些错误的响应。


推荐阅读