分离业务层错误和API错误

2024-05-19 18:48:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,这个头衔很糟糕;我对这里的头衔很糟糕。你知道吗

我想知道,当错误可能在应用程序内部引发时,在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层的信息(即使它们生活在一个根本不关心web层的驱动程序中)。不过,我确实喜欢web错误响应的“自动”方式。你知道吗

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

Tags: 代码web应用程序类型response错误方式分类
1条回答
网友
1楼 · 发布于 2024-05-19 18:48:20

我喜欢选项1。可能有点冗长,但也很清楚。你知道吗

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

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

相关问题 更多 >