【问题标题】:Why does my exit() command not work in python?为什么我的 exit() 命令在 python 中不起作用?
【发布时间】:2021-09-03 11:11:44
【问题描述】:

下面是我根据输入计算卡路里的代码,在打印语句之后我想退出代码并无限循环,直到用户输入正确的值。

import sys
def main():
    while True:
        try: 
            print("Please enter Age,Weight,Heart Rate and Workout Time ")
            Age,Weight,HR,Time = map(eval,input().split(' '))
            men = ( (Age * 0.2017) - (Weight * 0.09036) + (HR * 0.6309) - 55.0969 ) * Time / 4.184
            women =  ( (Age * 0.074) - (Weight * 0.05741) + (HR * 0.4472) - 20.4022 ) * Time / 4.184
            print("Men:",men," Calories \nWomen:",women,"Calories \n")
            exit()
        except:
            print("Please enter numbers only \n \n")

if __name__ == '__main__':
    main()

即使输入值正确且不退出代码,代码也会转到除非,我错过了什么?

【问题讨论】:

  • 你不需要退出,你需要从循环中break
  • 不要map(eval, ...) 改为map(float, input().split(' '))
  • 建议:应该进入try 块的唯一代码是可以引发异常的代码。其他所有内容都应在try 之外。
  • 欢迎来到 SO,Swayam。感谢您提供工作(最小)代码并描述了问题所在!

标签: python try-except


【解决方案1】:

exit()(某些形式;它实际上不应该在脚本中使用,所以它可以被覆盖来做奇怪的事情;你想要sys.exit())是通过引发SystemExit 异常来实现的(退出时不会冒泡这意味着finallywith 语句中的清理块不会执行,这很糟糕,因此它们使用异常机制进行清理)。 SystemExit 有两个特别之处:

  1. 如果未处理,它不会转储回溯并以固定状态 1 退出(它只是以提供的状态码静默退出程序)
  2. 不是Exception的孩子,所以except Exception:,很宽泛,还是抓不到

但是您使用了一个空的 except,它可以捕获 所有内容,包括 SystemExitDon't do that.

在这种特定情况下,正确的解决方案实际上是将exit() 替换为break,这将使您跳出while 循环并允许程序运行完成而无需在全部。并在使用时使用更窄的 except 子句。

【讨论】:

  • 好答案。您是否引用了“实际上不应该在脚本中使用”?我假设您指的是某种 PEP? (我只是好奇,这里没有批评)
  • @en_Knight:它是the constants added by the site module 之一,记录为:“site 模块(在启动期间自动导入,除非给出了-S 命令行选项)向内置命名空间添加了几个常量。它们对交互式解释器外壳很有用,不应在程序中使用。”它不能保证存在,像 IPython 这样的东西会以可能巧妙地破坏代码的方式覆盖它。 sys.exit() 没有问题。
  • 谢谢,我不知道!有趣的是,当我用谷歌搜索时,第一次点击它有一条评论“sys.exit() 不是一种可靠的关闭方式。如果在线程内调用它,它将仅终止该线程,除非它在主线程中"(来自stackoverflow.com/questions/19747371/…)。但这(A)远高于 OP 试图做的事情,(B)有点挑剔,因为你可能应该有一个更复杂的关闭程序,IMO,在多线程和复杂的东西中
  • @en_Knight: 是的,但是除了os._exit 之外的任何东西都不会结束带有其他正在运行的非守护线程的多线程程序。由于这种行为,您几乎从不想要os._exit;它不会抛出异常,它只是结束进程现在,并且不会调用所有应该“保证”运行的finallywith 清理。 os._exit 烧毁世界。如果sys.exit 没有做你想做的事,那是因为你没有正确使用守护线程,或者你的主线程没有告诉你的非守护线程在它退出时干净地停止,或者两者兼而有之。
  • 是的,我同意所有这些
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多