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

时间:2009-11-20 00:06:30

标签: python error-handling

标题太可怕了,我知道;我在这里的头衔很糟糕。

我想知道在应用程序内部引发错误时,在webapi中呈现统一错误响应的最佳方法是什么。

应用程序内部的错误对Web层一无所知(也不应该知道),因此Web层如何将myapp.PermissionError分类为403,json.DecodeError分为400, myapp.driver.InvalidValue进入500等等

我有一些想法,但我不是其中任何一个的忠实粉丝。

(正如这些片段可能意味着,这是Linux上的一个python应用程序)

  1. 使用大量except块来匹配我想要的异常类型。这就是我现在正在做的事情,但它越来越笨拙(我已经达到了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. 为每个提供响应代码的异常类添加一个接口,但我不喜欢这个,因为异常带有特定于Web层的信息(即使它们生活在一个没有驱动程序的内核中)完全关心网络层。我确实喜欢网络错误响应的“自动”方式。

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

1 个答案:

答案 0 :(得分:1)

我喜欢选项1.它可能更冗长,但也很清楚。

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

我同意选项3非常难看。无需处理该级别的错误行为,只需抛出异常。