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

我问这个问题是因为我有一些使用锁文件的python代码,我想知道在什么情况下程序可以在不抛出异常的情况下终止(或以不可处理的方式结束),然后就没有处理,锁文件必须手动删除。我想这样做:

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仍应激发。