根据我读到的内容,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
现在三个请求示例:
- 有人想要创造一只新狗,但提供了无效信息。因此验证器有一个返回 False 的 is_valid_dog 方法。
- 有人发出 GET 请求来检索有关某只不存在的狗的信息。狗服务访问了数据库,但什么也没找到。
- 用户想要了解狗的品种信息,该服务访问了第三方 API,但已关闭(获得 500 状态)。
处理这种类型的流量的最佳方法是什么?
- 在第一种情况下,当 is_valid_dog 返回 False 时我是否应该引发异常?或者向 Controller 返回 None/False 以便它可以将其映射到 400 状态代码?
- 我应该返回 None 以便 Controller 将返回值映射到 404 吗?
- 我是否应该捕获异常并使用消息引发自定义 ThirdPartyAPIException,并且 Controller 必须知道如何处理该异常?
我很好奇何时返回特定值或仅在不同层引发异常,以便 Controller 可以返回最终状态。一般来说,哪里是处理这些异常/流程的最佳位置。
最佳答案
您应该遵循 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
类以了解异常的流程以及这些错误的响应。
关于python - Python 中处理自定义异常的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51603164/