我有这段代码:
from django.db import transaction
with transaction.atomic():
try:
variable = 1
except Exception:
raise Exception()
print(variable)
并且pycharm(2018.1.2)告诉我variable
函数print
中的can be not defined
。在哪种情况下会发生?或者它是一个pycharm bug?
答案 0 :(得分:2)
在哪种情况下会发生?
如果上下文管理器吞下该异常,并且您将raise
语句替换为在执行流程到达print(variable)
行之前不会中断的任何其他内容。
根据经验法则:不依赖于条件的代码(最常见的含义)不应使用条件定义的名称,只有与定义名称的分支属于同一分支的代码才应使用访问此名称。
即使您“知道”当前实现中的 ,如果未定义(如您的示例中),也永远不会访问此名称,任何甚至是次要的实现更改都可能会破坏此前提条件,您可能不会必须注意它,也没有足够的单位测试覆盖率,以确保您的测试能够解决问题。我经常看到这种情况经常发生,有时候这个bug只会在变化后几个月出现(通常是在一些非常罕见的病态角落情况下的错误处理代码中)。
总而言之,在条件部分之前无条件地定义具有一些标记值(None
或其他任何有意义的名称)的名称将确保您的代码不会意外地破坏应该是一个小的代码更改。