我正在编写一本开放源码的 Python 中级书籍,并浏览了一些 PEP。在 PEP310 , 有一个关于“with”语句的旧建议。该提案最终被否决,但以下陈述让我印象深刻:“另一个常见错误是在 try block 中编写“acquire”调用,如果获取失败,它会错误地释放锁。”
有人可以详细说明将 acquire 放入 try 中会如何改变吗?据我了解,Python 中的 acquire 调用仅返回一个 bool 值,指示是否已成功获取锁,那么将其放入 try block 中有何改变呢?
最佳答案
我相信这就是它所指的:
try:
lock.acquire()
finally:
lock.release()
如果 acquire()
引发异常,将调用 release()
,即使 acquire()
没有成功。在当前未锁定的锁上调用 release()
可能会引发另一个异常,即仅与问题根源间接相关的异常。
编写 block 的正确方法是使用 with
,或者:
lock.acquire()
try:
...
finally:
lock.release()
无论文档是否建议调用引发异常,您都应该始终编写代码以应对异常。没有什么可以阻止 future 的行为改变。
关于python - 在 try block 中获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137554/