如何从函数内部终止脚本?

0 投票
2 回答
2217 浏览
提问于 2025-04-18 12:16

我刚开始学习Python,想知道有没有办法在一个函数里面结束整个脚本?

我举个具体的例子,我用一个函数来当文本游戏的主菜单。我在代码开始的时候调用这个函数,然后后面是实际的游戏代码。我希望能有一种方法从主菜单结束脚本。我听说过:

import sys
sys.exit()

但是因为我在一个函数里面使用这个方法,而脚本外面还有其他代码要执行,所以它并没有立刻停止,而是继续执行其他部分的代码。有没有办法让脚本自动结束,不管它在哪里?即使我需要制造一个错误来停止程序,只要能让用户看不到这个错误,我也可以接受。

提前感谢任何帮助!

2 个回答

0

sys.exit应该是从主线程强制退出的方式,不过你可以通过一个没有指定异常的try/except来绕过这个限制。一个常见的替代方法是把主线程放在一个try/except中,专门处理键盘中断和/或系统退出。

比如说

>>> try:
...   # some risky thing
... except:
...   # Dah! catching all exceptions including SystemExit and KeyboardInterrupt
...

这样可以防止在“某些风险”中调用系统退出时真的退出(因为现在这个情况被except处理了,就像except:/pass一样)。

更好的做法是

>>> def main():
...    try:
...       riskybehavior()
...    except SystemExit, KeyboardInterrupt:
...       userExit()
...
>>> def riskybehavior():
...    try:
...       myrisk()
...    except TypeError as te:
...       print str(te)
...

这里的TypeError是你从myRisk中预期得到的错误。至少,

except Exception as e:

因为SystemExit和KeyboardInterrupt并不是Exception的子类。

0

你可以直接抛出一个异常,然后在你想要返回的地方捕获这个异常。

比如说:

class HaltException(Exception):
    pass

def internal_code():
    #some code
    if exit_condition:
        raise HaltException("We decided we want to halt the script")



def main_entry():    
    try:
        #call actual code
        internal_code()
    #Catch exception (to avoid error message)
    except HaltException:
        #And exit cleanly
        return

注意:你可以使用 "except KeyboardInterrupt:" 来捕获键盘中断(在Windows上是按Ctrl+C)。

撰写回答