python - 将业务层错误与 API 错误分开

标签 python error-handling

我知道这个标题很糟糕;我对这里的标题很糟糕。

我想知道当应用程序深处可能出现错误时,在 webapi 中呈现统一错误响应的最佳方式是什么。

应用程序深处的错误对 Web 层一无所知(也不应该),那么 Web 层如何将 myapp.PermissionError 分类为 403、json .DecodeError 变为 400,myapp.driver.InvalidValue 变为 500,等等

我有一些想法,但我不太喜欢其中任何一个。

(正如代码片段所暗示的,这是 Linux 上的 python 应用程序)

  1. 使用大量 except block 来匹配我想要的异常类型。这就是我目前正在做的事情,但它变得越来越笨拙(我已经达到 8 级,还有很多要做)。

    try
      business.DoIt()
    except DecodingError:
      respond(400)
    except PermissionError:
      response(403)
    ...etc...
    
  2. 创建异常类型的映射或列表并将它们映射到响应代码。这看起来并不比(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
    
  3. 为每个提供响应代码的异常类添加一个接口(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/

相关文章:

python - 神经网络训练平台中的梯度下降

python - 使用 PyGame 设计冒险游戏的正确方法是什么?

c++ - 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?

reactjs - 如何在浏览器中记录错误(错误 View )而不是 React 中的空白屏幕

java - 从 JFrame 输入 'Date' 到 MySQL 数据库

javascript - Prototype JS 吞下 dom :loaded, 和 ajax 回调中的错误?

python - 如何在 Keras 中首先通过卷积网络然后通过循环网络传递一对图像?

python - Dash Python App 按钮用于操作并刷新页面

python - 将变量传递给索引函数 - Python

android - 如果无法加载 url,如何加载占位符?