标题太可怕了,我知道;我在这里的头衔很糟糕。
我想知道在应用程序内部引发错误时,在webapi中呈现统一错误响应的最佳方法是什么。
应用程序内部的错误对Web层一无所知(也不应该知道),因此Web层如何将myapp.PermissionError
分类为403,json.DecodeError
分为400, myapp.driver.InvalidValue
进入500等等
我有一些想法,但我不是其中任何一个的忠实粉丝。
(正如这些片段可能意味着,这是Linux上的一个python应用程序)
使用大量except
块来匹配我想要的异常类型。这就是我现在正在做的事情,但它越来越笨拙(我已经达到了8级,而且还有更多的东西要去)。
try
business.DoIt()
except DecodingError:
respond(400)
except PermissionError:
response(403)
...etc...
创建例外类型的映射或列表,并将它们映射到响应代码。这似乎并不比(1)好多了,但它确实清理了代码。
error_map = [(DecodingError, 400), (PermissionError, 403)]
try:
DoIt()
except Exception, exc:
for type, code in error_map:
if isinstance(exc, type):
response(code)
return
为每个提供响应代码的异常类添加一个接口,但我不喜欢这个,因为异常带有特定于Web层的信息(即使它们生活在一个没有驱动程序的内核中)完全关心网络层。我确实喜欢网络错误响应的“自动”方式。
class PermissionError(Exception):
web_status_code = 403
try:
Doit()
except:
response(exc.web_status_code)
答案 0 :(得分:1)
我喜欢选项1.它可能更冗长,但也很清楚。
选项2将抛出异常的点与决定如何处理异常的点分开。实际上,这可能不会是一个太大的问题,但如果你不需要,为什么要把它分开呢?
我同意选项3非常难看。无需处理该级别的错误行为,只需抛出异常。