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标记了这个问题.
这被称为EAFP或更容易要求宽恕而不是许可.来自Python词汇表:
这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常.这种干净,快速的风格的特点是存在许多
try和except陈述.该技术与许多其他语言(例如c)共有的LBYL风格形成对比.
LBYL意味着在你跳跃之前先看看.再次来自Python词汇表:
这种编码风格在进行调用或查找之前明确地测试前置条件.这种风格与EAFP方法形成对比,其特点是存在许多if语句.
然后它继续为你的if not entityExists(id):建议提供一个很好的反例:
在多线程环境中,LBYL方法可能会在"外观"和"跳跃"之间引入竞争条件.例如,
if key in mapping: return mapping[key]如果另一个线程在测试之后但在查找之前从映射中删除了键,则代码可能会失败.可以使用锁定或使用EAFP方法解决此问题.
当用Python(或任何语言)编写时,它有助于遵循该语言的习语,这使得您的代码更易于被其他人阅读.
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |