我知道这个标题很糟糕;我对这里的标题很糟糕。
我想知道当应用程序深处可能出现错误时,在 webapi 中呈现统一错误响应的最佳方式是什么。
应用程序深处的错误对 Web 层一无所知(也不应该),那么 Web 层如何将 myapp.PermissionError
分类为 403、json .DecodeError
变为 400,myapp.driver.InvalidValue
变为 500,等等
我有一些想法,但我不太喜欢其中任何一个。
(正如代码片段所暗示的,这是 Linux 上的 python 应用程序)
使用大量
except
block 来匹配我想要的异常类型。这就是我目前正在做的事情,但它变得越来越笨拙(我已经达到 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
为每个提供响应代码的异常类添加一个接口(interface),但我不喜欢这样做,因为这样异常就会携带 Web 层特定信息(即使它们位于驱动程序的深处,而驱动程序并不支持该信息)根本不关心网络层)。不过,我确实喜欢网络错误响应的“自动”程度。
class PermissionError(Exception): web_status_code = 403 try: Doit() except: response(exc.web_status_code)
最佳答案
我喜欢选项1。它可能有点冗长,但也很清楚。
选项 2 将抛出异常的点与做出如何处理异常的决定分开。事实上,这可能不是什么大问题,但如果不需要的话,为什么要把它分开呢?
我同意选项 3 相当难看。无需处理该级别的错误行为,只需抛出异常即可。
关于python - 将业务层错误与 API 错误分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767504/