【问题标题】:Terminate Script from inside a function?从函数内部终止脚本?
【发布时间】:2014-07-06 15:22:03
【问题描述】:

我是 Python 的绝对初学者,想知道是否有办法从函数内部终止整个脚本?

我的具体例子是我正在使用一个函数来充当文本游戏的主菜单。我在代码的开头调用函数,然后是实际的游戏编码。我希望有一种方法可以从主菜单结束脚本。我听说过:

import sys
sys.exit()

但是,因为我在函数中使用它,并且脚本在函数之外还有更多工作要做,所以它会继续执行代码的其他部分,而不是立即停止。有没有办法自动关闭脚本,不管它在哪里?即使我必须以某种方式创建一个停止程序的错误,如果有办法向用户隐藏错误,我也可以接受。

提前感谢您的帮助!

【问题讨论】:

  • 您能否更清楚您的确切问题是什么? This 似乎有效,因此为了了解问题所在,您应该发布 minimal example
  • 你能显示原始代码吗?因为sys.exit() 应该在它发生的地方退出脚本。
  • sys.exit 只会引发SystemExit。如果你在某处有一个空白的except,它可能会抓住它。您应该向我们展示您的代码的相关部分。

标签: python terminate


【解决方案1】:

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 的子类

【讨论】:

    【解决方案2】:

    你可以只引发一个异常,然后在你想要返回的关卡中捕获它

    例如:

    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
    

    注意-您可以使用“除了 KeyboardInterrupt:”来捕获键盘中断(Windows 上的 Ctrl+C)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多