如何在没有回溯的情况下退出 Python?

新手上路,请多包涵

我想知道如何在不对输出进行回溯转储的情况下退出 Python。

我仍然希望能够返回错误代码,但我不想显示回溯日志。

我希望能够使用 exit(number) 退出而不留下痕迹,但如果出现异常(不是退出),我想要跟踪。

原文由 sorin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 262
2 个回答

您可能遇到异常并且程序因此而退出(带有回溯)。因此,首先要做的是在完全退出之前捕获该异常(可能带有一条消息,例如给出的示例)。

在你的 main 例程中尝试这样的事情:

 import sys, traceback

def main():
    try:
        do main program stuff here
        ....
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)

if __name__ == "__main__":
    main()

原文由 jkp 发布,翻译遵循 CC BY-SA 3.0 许可协议

也许您正在尝试捕获所有异常,而这是捕获由 --- 引发的 sys.exit() SystemExit 异常?

 import sys

try:
    sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
    sys.exit(e)
except:
    # Cleanup and reraise. This will print a backtrace.
    # (Insert your cleanup code here.)
    raise

一般来说,使用 except: 而不命名异常是一个坏主意。您会捕获各种您不想捕获的东西——例如 SystemExit 它还可以掩盖您自己的编程错误。我上面的例子很愚蠢,除非你在做一些清理方面的事情。您可以将其替换为:

 import sys
sys.exit(1) # Or something that calls sys.exit().

如果您需要不加注就退出 SystemExit

 import os
os._exit(1)

我在 unittest 下运行的代码中执行此操作并调用 fork() 。当分叉进程引发 SystemExit 时获得单元测试。这绝对是一个角落案例!

原文由 bstpierre 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题