Python 尝试 block 大小

标签 python django exception coding-style

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

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

Django 示例:

  • 长 block :

    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
    
  • 短 block :

    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
    

哪种情况更好?

最佳答案

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

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

关于Python 尝试 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25030656/

相关文章:

python - 识别由左侧的 delta 和右侧的不同 delta 链接的集群

python - 使用 bool 索引复制或查看 numpy 子数组

java - 在哪里检查值并抛出异常

python - Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的版本不同

java - SolrJ 没有捕获 SolrException

java - 线程中的异常 "main"递归中的 java.lang.StackOverflowError

python - Ansible 解析 JSON 对象

python - 在将包上传到 pypicloud 之前更新 setup.py 中的版本

python - Django - 从单独的应用程序导入 View

python - 鹡鸰中的多级分类