使用异常来控制代码流

Ala*_*sta 2 python exception

afaik使用异常来处理代码流是错误的.我正在使用一个名为getEntity(id)的方法的代码,并且当找不到实体时,getEntity会抛出一个DoesNotExist异常.没有entityExists(id)方法.要检查实体是否存在,代码通常会:

try: 
   getEntity(id)
catch DoesNotExist as e:
   # entity does not exist
Run Code Online (Sandbox Code Playgroud)

在我看来这会更好:

if not entityExists(id):
   # entity does not exist
Run Code Online (Sandbox Code Playgroud)

这^是常识吗?我认为代码是这样的,因为它使用Django并且它正在复制Django异常名称(DoesNotExist)以及它处理实体不存在的常用方法.

问题并不是特定于Python,但我使用的代码是在Python中,因此我用Python标记了这个问题.

Joh*_*web 8

这被称为EAFP更容易要求宽恕而不是许可.来自Python词汇表:

这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常.这种干净,快速的风格的特点是存在许多tryexcept陈述.该技术与许多其他语言(例如共有的LBYL风格形成对比.

LBYL意味着在你跳跃之前先看看.再次来自Python词汇表:

这种编码风格在进行调用或查找之前明确地测试前置条件.这种风格与EAFP方法形成对比,其特点是存在许多if语句.

然后它继续为你的if not entityExists(id):建议提供一个很好的反例:

在多线程环境中,LBYL方法可能会在"外观"和"跳跃"之间引入竞争条件.例如,if key in mapping: return mapping[key]如果另一个线程在测试之后但在查找之前从映射中删除了键,则代码可能会失败.可以使用锁定或使用EAFP方法解决此问题.

当用Python(或任何语言)编写时,它有助于遵循该语言的习语,这使得您的代码更易于被其他人阅读.