python程序以什么方式终止而不引发异常?
我问这个问题是因为我有一些使用锁文件的python代码,我想知道在什么情况下程序可以在不抛出异常的情况下终止(或以不可处理的方式结束),然后就没有处理,锁文件必须手动删除。我想这样做:python程序以什么方式终止而不引发异常?,python,Python,我问这个问题是因为我有一些使用锁文件的python代码,我想知道在什么情况下程序可以在不抛出异常的情况下终止(或以不可处理的方式结束),然后就没有处理,锁文件必须手动删除。我想这样做: try: % Check if lock file exists; if not, create it, do some processing, etc... finally: % Process ended --or-- possibly exception thrown; clean up l
try:
% Check if lock file exists; if not, create it, do some processing, etc...
finally:
% Process ended --or-- possibly exception thrown; clean up lock file
例如,ctrl+c可以由异常处理,断裂的管道可以由异常处理,等等
我能想到的唯一一种情况是,如果计算机的电源被切断,程序可以毫无例外地终止。在这种情况下,我可以编写一个脚本,在启动时清除所有锁文件。还有其他的吗
EDIT:意思是说“锁定文件”而不是“标志文件”
os.\u退出
会立即终止程序,但它的使用是非常不鼓励的
其他场景包括用户发送SIGKILL
(*NIX),或者电源关闭,或者某种操作系统内核死机,或者您的计算机从第二个故事窗口掉出来
请注意,如果您有要删除的锁定文件,那么实现相同安全级别的等效方法(可能更惯用的方法)是使用上下文管理器<代码>上下文库可以帮助:
import contextlib
@contextlib.contextmanager
def lock():
try:
create_lock()
yield 'whatever you want'
finally:
remove_lock()
用法如下所示:
with lock() as x:
assert x == 'whatever you want'
do_stuff_with_lock_safety()
显然,这并不比您最初使用try/finally
(我也在使用它)的想法更安全,但是每次使用时键入的内容更少,如果上下文管理器是创建/移除锁的唯一方法,然后,用户不需要记住如何清理自己,因为上下文管理器会为您进行清理
import sys
sys.exit(status=0)
status-可选参数arg可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。
操作系统的消极方面是程序在没有调用清理处理程序、刷新stdio缓冲区等的情况下完成。在linux中,存在无法捕获的终止信号。但不确定其他平台……除了linux kill信号,还有可能的操作系统故障:Windows蓝屏、linux内核死机。。。不是100%确定,但我想在这些情况下也不会运行代码。@mkiever:然后还有硬件故障:没有电源、烧坏、被锤子砸碎等)嗯,总是正常退出。这并不涉及异常,但这可能不是您正在考虑的那种情况。但是,在
with
块中,计算机的电源被关闭(或者调用操作系统)。它会清理锁文件吗?@jucestain--不会。这就是我所说的“这并不比你最初的想法更安全”。最终,在这种情况下,没有什么可以做的(在python或我所知道的任何其他语言中)sys.exit
引发SystemExit
异常。如果在中调用了sys.exit
,则finally仍应激发。