如何在Python中无追溯退出?

308 投票
11 回答
664275 浏览
提问于 2025-04-15 13:11

我想知道怎么在Python中退出程序,而不想在输出中看到错误追踪信息。

我还是希望能返回一个错误代码,但不想显示错误追踪日志。

我想用 exit(number) 来退出程序时不显示追踪信息,但如果出现了异常(不是正常退出),我希望能看到追踪信息。

11 个回答

48

在编程中,很多时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。我们需要确保水不会洒出来,也就是要保证数据的完整性。

有时候,数据的格式可能会不一样,就像是一个水桶是圆形的,另一个是方形的。我们需要找到一种方法,把圆形的水桶里的水转移到方形的水桶里,而不让水洒出来。这就需要我们对数据进行转换和处理。

在编程中,这种转换通常会用到一些函数或者方法。函数就像是一个工具,可以帮助我们完成特定的任务,比如把一种格式的数据转换成另一种格式。

总之,处理数据就像是搬运水,确保在搬运过程中不洒出来,并且能够把水从一个桶顺利转移到另一个桶里。

import sys
sys.exit(1)
87

也许你是想捕捉所有的异常,但这样做可能会捕捉到由 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() 的代码中这样做。当 fork 出去的进程引发 SystemExit 时,unittest 会捕捉到。这绝对是个特殊情况!

323

你可能遇到了一个异常,这个异常导致程序退出了(并且会显示错误追踪信息)。所以,首先要做的就是捕捉这个异常,然后再优雅地退出程序(可以给出一些提示信息,比如示例中所示)。

在你的 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()

撰写回答