Python 将业务层错误与API错误分离

Python 将业务层错误与API错误分离,python,error-handling,Python,Error Handling,我知道这个标题很可怕;我不擅长头衔,所以在这里 我想知道,当错误可能在应用程序内部深处引发时,在webapi中呈现统一错误响应的最佳方式是什么 应用程序中的错误根本不了解web层(也不应该知道),因此web层如何将myapp.PermissionError分为403、json.DecodeError分为400、myapp.driver.InvalidValue分为500等 我有一些想法,但我对其中任何一个都不是很喜欢 (正如代码片段可能暗示的,这是linux上的python应用程序) 使用大量除

我知道这个标题很可怕;我不擅长头衔,所以在这里

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

应用程序中的错误根本不了解web层(也不应该知道),因此web层如何将
myapp.PermissionError
分为403、
json.DecodeError
分为400、
myapp.driver.InvalidValue
分为500等

我有一些想法,但我对其中任何一个都不是很喜欢

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

  • 使用大量除之外的
    块来匹配我想要的异常类型。这就是我目前正在做的,但它越来越笨拙(我已经到了8岁,还有很多事情要做)

  • 创建异常类型的映射或列表,并将它们映射到响应代码。最后,这看起来并不比(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层的信息(即使它们生活在一个根本不关心web层的驱动程序中)。不过,我确实喜欢web错误响应的“自动”方式

    class PermissionError(Exception):
      web_status_code = 403
    try:
      Doit()
    except:
      response(exc.web_status_code)
    

  • 我喜欢选项1。这可能有点冗长,但也很清楚

    选项2将抛出异常的点与决定如何处理异常的点分开。事实上,这可能不是一个太大的问题,但是如果你不需要的话,为什么要把它分开呢


    我同意选项3相当丑陋。无需在该级别处理错误行为,只需抛出异常。

    我喜欢选项1。这可能有点冗长,但也很清楚

    选项2将抛出异常的点与决定如何处理异常的点分开。事实上,这可能不是一个太大的问题,但是如果你不需要的话,为什么要把它分开呢

    我同意选项3相当丑陋。无需在该级别处理错误行为,只需抛出异常即可

    class PermissionError(Exception):
      web_status_code = 403
    try:
      Doit()
    except:
      response(exc.web_status_code)