根据我所读的内容,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
现在有三个请求示例:
处理这种类型的流量的最佳方法是什么?
我很好奇何时返回特定值或只是在不同层之间引发异常,以便控制器可以返回最终状态。通常,在哪里处理这些异常/流的最佳位置。
答案 0 :(得分:1)
您应该遵循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
来了解异常流和这些错误的响应。
答案 1 :(得分:0)
对于第一个请求示例:
对于第二个请求示例:
对于第三个请求示例:
例如为django rest框架设置自定义异常:
from django.utils.encoding import force_text
from rest_framework.exceptions import APIException
class ServiceUnavailable(APIException):
"""
Raise error for external services that cannot be reached
"""
status_code = 503
default_detail = "Service temporarily unavailable, try again later."
default_code = "service_unavailable"
def __init__(self, detail, field):
if detail is not None:
self.detail = {field: [force_text(detail)]}
else:
self.detail = {"detail": force_text(self.default_detail)}