python - 在 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
现在三个请求示例:
- 有人想创造一只新狗,但提供了无效信息。所以验证器有一个返回 False 的 is_valid_dog 方法。
- 有人发出 GET 请求以检索有关某条不存在的狗的信息。狗服务访问数据库,但没有找到任何东西。
- 用户想要犬种信息,该服务访问了第三方 API,但它已关闭(已获得 500 状态)。
处理这种类型的流量的最佳方法是什么?
- 在第一种情况下,我应该在 is_valid_dog 返回 False 时引发异常吗?还是将 None/False 返回给控制器,以便它可以将其映射到 400 状态代码?
- 我应该返回 None 以便控制器将返回值映射到 404?
- 我是否应该捕获异常并使用消息引发自定义 ThirdPartyAPIException 并且控制器必须知道如何处理?
我很好奇何时返回特定值或只是跨不同层引发异常,以便控制器可以返回最终状态。一般来说,处理这些异常/流的最佳位置在哪里。
解决方案
您应该遵循 DRF 的方法,它是 RESTful django api 的事实标准。看看 DRF 的源代码:https ://github.com/encode/django-rest-framework/blob/master/rest_framework/exceptions.py 。
创建一个默认
ValidationError
异常,根据您的上下文自定义每个错误。如果引发异常,则返回400
状态码;如果
None
返回,则引发NotFound
异常,并带有404
状态码;我会坚持捕获异常并显示
503
代码“服务不可用”。
查看类APIException
以了解异常的流程和这些错误的响应。
推荐阅读
- c++ - 可选的
> 与可选 & - 实际例子? - sql - 如何将 CONNECT BY PRIOR Oracle 样式查询重写为 RECURSIVE CTE Postgres 以进行具有相关 WHERE 子句的查询?
- vb.net - ++ 在 VB.NET 中做了什么(如果有的话)?
- c# - Razor 页面:值不会从 OnGet() 停留在 OnPost()
- ibm-cloud - IBM Graph 还存在吗?
- c# - 是否可以在不使用证书的情况下进行数字签名和验证签名?
- reactjs - React-redux,无法与我的根组件使用连接
- loops - 埃菲尔横跨 an_iterable as vs is
- javascript - 如何编辑 PubNub 消息并添加对单个消息的反应
- java - Java 工厂,但对象的属性略有不同