假设我有一个threading.Lock()
对象,我想获取它来使用资源。假设我想对资源使用try ... except ...
子句。
有几种方法可以做到这一点。
方法1
import threading
lock = threading.Lock()
try:
with lock:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
如果在do_stuff1()
或do_stuff2()
期间发生错误,是否会解除锁定?还是最好使用以下方法之一?
方法2
with lock:
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
方法3
lock.acquire():
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
finally:
lock.release()
哪种方法最适合在发生错误时释放锁?
with
"上下文管理器"需要一个__exit__
方法,在这种情况下,它将确保无论发生什么,lock
都是release
d。
如果您想处理在使用该lock
的过程中发生的异常,则应将try
放在with
块内,即方法2是正确的方法。通常,您应该始终将try
块中的代码量降至最低。
您还应该尽可能具体地说明可能出错的地方;裸露的except:
是不好的做法(例如参见"except
的罪恶")。至少(即使是一个简单的例子!)您应该使用except Exception:
。