14.7 结束执行

当程序运行完成,所有模块最高级的语句执行完毕后退出,我们便称这是干净的执行。可能有很多情况,需要从Python提前退出,比如某种致命错误,或是不满足继续执行的条件的时候。

在Python中,有各种应对错误的方法。其中之一便是通过异常和异常处理。另外一个方法便是建造一个“清扫器”方法,这样便可以把代码的主要部分放在if语句里,在没有错误的情况下执行,因而可以让错误的情况“正常地”终结。然而,有时也需要在退出调用程序的时候,返回错误代码以表明发生何种事件。

14.7.1 sys.exit() and SystemExit

立即退出程序并返回调用程序的主要方式是sys模块中的exit()函数。sys.exit()的语法为:当调用 sys.exit()时,就会引发systemExit()异常。除非对异常进行监控(在一个try语句和合适的except子句中),异常通常是不会被捕捉到或处理的,解释器会用给定的状态参数退出,如果没有给出的话,该参数默认为0。System Exit是唯一不看作错误的异常。它仅仅表示要退出Python的愿望。

14.7 结束执行 - 图1

sys.exit()经常用在命令调用的中途发现错误之后,比如,如果参数不正确,无效,或者参数数目不正确。下面的例子14.4 (args.py)仅仅是一个测试脚本,在正确执行之前需要给出确定数目的参数。

执行这个脚本我们得到如下输出:

14.7 结束执行 - 图2

调用sys.exit()使Python解释器退出。exit()的任何整型参数都会以退出状态返回给调用者,该值默认为0;

14.7 结束执行 - 图3

14.7 结束执行 - 图4

许多命令行驱动的程序在进行之前,用脚本的核心功能测试了输入的有效性。如果验证失败,那么便调用usage()函数去告知用户什么样的问题会导致这个错误,并“提示”用户如何才能正确地调用脚本。

14.7.2 sys.exitfunc()

sys.exitfunc()默认是不可用的,但你可以改写它以提供额外的功能。当调用了sys.exit()并在解释器退出之前,就会用到这个函数了。这个函数不带任何参数的,所以你创建的函数也应该是无参的。

如果sys.exitfunc已经被先前定义的exit函数覆盖了,最好的方法是把这段代码作为你exit()函数的一部分来执行。一般说来,exit函数用于执行某些类型的关闭活动,比如关闭文件和网络连接,最好用于完成维护任务,比如释放先前保留的系统资源。

下面的例子介绍了如何设置exit()函数,如果已经被设置了,则确保执行该函数:

14.7 结束执行 - 图5

在清理执行以后,我们执行了老的exit()函数。getattr()调用只是检查了先前的exitfunc()是否已经定义。如果没有,那么prev_exit_func赋值为None,否则,prev_exit_func变成exit函数新的别名,然后作为参数传入我们的新exit函数,my_exit_func。

对getattr()的调用可以这样写:

14.7 结束执行 - 图6

14.7.3 os.__exit()函数

os模块的__exit()函数不应该在一般应用中使用(平台相关,只适用特定的平台,比如基于Unix的平台,以及Win32平台)。其语法为:

14.7 结束执行 - 图7

这个函数提供的功能与sys.exit()和sys.exitfunc()相反,根本不执行任何清理便立即退出Python。与sys.exit()不同,状态参数是必需的。通过sys.exit()退出是退出解释器的首选方法。

14.7.4 os.kill() Function

os模块的kill()函数模拟传统的unix函数来发送信号给进程。kill()参数是进程标识数(PID)和你想要发送到进程的信号。发送的典型信号为SIGINT、SIGQUIT,或更彻底地,SIGKILL,来使进程终结。