可以最大化或最小化 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/