2

我正在编写一本开源的中级 Python 书籍,并阅读了许多 PEP。在PEP310中,有一个关于“with”语句的旧提案。这个提议最终被拒绝了,但下面的语句让我印象深刻:“另一个常见的错误是在 try 块中编写“获取”调用,如果获取失败,它会错误地释放锁。

有人可以详细说明将获取内容放在尝试中如何改变事情吗?据我了解,Python 中的获取调用只是返回一个布尔值,指示是否成功获取了锁,那么将它放在 try 块中会如何改变事情呢?

4

1 回答 1

6

我相信这就是它所指的:

try:
    lock.acquire()
finally:
    lock.release()

如果acquire()引发异常,release()将被调用,即使acquire()没有成功。调用release()当前未锁定的锁可能会引发另一个异常,即仅与问题根源间接相关的异常。

编写块的正确方法是使用with, 或:

lock.acquire()
try:
    ...
finally:
    lock.release()

无论文档是否建议调用引发异常,您都应该始终编写代码以应对异常。没有什么可以阻止未来行为的改变。

于 2013-01-03T11:04:50.170 回答