【问题标题】:Python try block sizePython尝试块大小
【发布时间】:2014-07-30 07:06:44
【问题描述】:

可以最大化或最小化 try-except 块。

有时我不知道,我必须坚持哪种风格。

Django 示例:

  • 长块:

    try:
        entity1 = Entity1.objects.get(id=1)
        entity2 = Entity2.objects.get(id=1)
        print somedict['unexistantkey']
        some.another.logic()
    except Entity1.DoesNotExists:
        # do something
    except Entity2.DoesNotExists:
        # do something
    except KeyError:
        # do something
    except CustomDomainException:
        # do somethong
    
  • 短块:

    try:
        entity1 = Entity1.objects.get(id=1)
    except Entity1.DoesNotExists:
        # do something
    
    try:
        entity2 = Entity2.objects.get(id=1)
    except Entity2.DoesNotExists:
        # do something
    
    try:
        print somedict['unexistantkey']
    except KeyError:
        # do something
    
    try:
        some.another.logic()
    except CustomDomainException:
        # do somethong
    

哪种情况更好?

【问题讨论】:

    标签: python django exception coding-style


    【解决方案1】:

    他们做不同的事情,所以你使用哪一个取决于你想要做什么。第一个捕获匹配 except 子句的 &any* 的 try 块内四行的 any 中的任何错误。第二个版本每行“尝试过”的代码只捕获一种异常。例如,如果从entity1 = Entity1.objects.get(id=1) 行引发一个 KeyError,第一个版本将捕获一个 KeyError;第二个版本不会捕获这样的错误,因为该行没有except KeyError 子句。

    也就是说,一般来说,保持try 块短是个好主意。如果您要为第一行处理的唯一错误是Entity1.DoesNotExist,则使用第二种方法。在这种情况下, KeyError 将“计入”为真正的异常,并将向上传播而不是被此代码捕获,这可能是您想要的。使用带有大量 except 子句的长 try 块可能会导致在您实际上不想捕获它们时捕获错误。但是,如果您确实想捕获任何指定的异常,无论它发生在块中的哪个位置,拥有这样的块是有意义的。

    【讨论】:

      【解决方案2】:

      应该首选短块。

      【讨论】:

      【解决方案3】:

      这取决于你想要达到的目标。

      对于 django 中的对象,您可以使用快捷键get_or_createget_object_or_404get_list_or_404

      https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#get-object-or-404

      对于字典,您应该使用print somedict.get('unexistantkey')

      它将返回 None 而不是 KeyError。

      如果您想为不存在的密钥做某事,您可以这样做:

      variable = somedict.get('unexistantkey')
      
      if not variable:
          print 'does not exist'
      

      这些将允许您以更易读的方式构建代码。

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2014-09-02
        • 2017-01-25
        • 1970-01-01
        相关资源
        最近更新 更多