【问题标题】:Possible to have multiple Python except statements when using try (without searching for a specific except)?使用 try 时可能有多个 Python except 语句(不搜索特定的 except)?
【发布时间】:2015-12-11 03:17:37
【问题描述】:

这是我当前的代码:

def get_queryset(self)
    pk = self.kwargs['pk']

    try: 
        postD = PostD.objects.get(pk=pk)
        # In the line below, PostReply.objects.filter(postD=postD) is
        # not guaranteed to exist, so I am using a try statement.
        return PostReply.objects.filter(postD=postD)

    except:
        postY = PostY.objects.get(pk=pk)
        # In the line below, PostReply.objects.filter(postY=postY) is
        # not guaranteed to exist either, so this may raise an error.
        return PostReply.objects.filter(postY=postY)

    # Here, I want one last except statement to execute if the above try
    # and except statements fail... Is it okay to just add another except
    # statement like this:

    except:
        postR = PostR.objects.get(pk=pk)
        # If the above try and except statement fail, this is guaranteed to
        # not throw an error.
        return PostReply.objects.filter(postR=postR)

我知道我可以这样做:

try:
    # code
except ObjectDoesNotExist:
    # code
except:
    # last part of code

但不能保证我会收到ObjectDoesNotExist 错误(我不能保证我会收到什么错误)。所以我想知道是否有一种方法可以拥有多个 except 语句而不指定要查找的异常?我上面的做法是这样吗(我只有 try: except: except: 可以使用吗?

【问题讨论】:

    标签: python django try-catch


    【解决方案1】:

    一个光秃秃的except: 会捕获任何东西,所以在这种情况下第二个 except 块是没有意义的。

    您可能想将第一个 except 块中的代码放入另一个嵌套的 try/except 块中。

    注意Pokemon exception handling 被认为是不好的编码风格,最好只尝试捕获您打算处理的实际异常 - 在这种情况下,只捕获 DoesNotExist 应该足够了。

    您可以考虑使用循环来重构它:

    PostModels = {
        'postD': PostD,
        'postY': PostY,
        'postR': PostR,    
    }
    
    for k,Post in PostModels.items():
        try: 
            post = Post.objects.get(pk=pk)
        except Post.DoesNotExist:
            pass
        else:
            return PostReply.objects.filter(k=post)
    else:
        # all 3 lookups failed, how do you want to handle this?
    

    【讨论】:

      【解决方案2】:

      由于第一个 except 将捕获从 try 块引发的任何异常,“上述 try 和 except 语句失败”的唯一方法是如果第一个 except 块中的代码引发异常。要抓住它,你应该直接用try/except 包装它:

      def get_queryset(self)
          try:
              ...
          except:
              try:
                  <<original first except-block here>>>
              except:
                  <<original second except-block here>>>
      

      另外,一般来说你应该避免裸露的except:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-10
        • 2011-09-29
        • 2011-04-08
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多