如何在Python中无追溯退出?
我想知道怎么在Python中退出程序,而不想在输出中看到错误追踪信息。
我还是希望能返回一个错误代码,但不想显示错误追踪日志。
我想用 exit(number)
来退出程序时不显示追踪信息,但如果出现了异常(不是正常退出),我希望能看到追踪信息。
11 个回答
在编程中,很多时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。我们需要确保水不会洒出来,也就是要保证数据的完整性。
有时候,数据的格式可能会不一样,就像是一个水桶是圆形的,另一个是方形的。我们需要找到一种方法,把圆形的水桶里的水转移到方形的水桶里,而不让水洒出来。这就需要我们对数据进行转换和处理。
在编程中,这种转换通常会用到一些函数或者方法。函数就像是一个工具,可以帮助我们完成特定的任务,比如把一种格式的数据转换成另一种格式。
总之,处理数据就像是搬运水,确保在搬运过程中不洒出来,并且能够把水从一个桶顺利转移到另一个桶里。
import sys
sys.exit(1)
也许你是想捕捉所有的异常,但这样做可能会捕捉到由 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 会捕捉到。这绝对是个特殊情况!
你可能遇到了一个异常,这个异常导致程序退出了(并且会显示错误追踪信息)。所以,首先要做的就是捕捉这个异常,然后再优雅地退出程序(可以给出一些提示信息,比如示例中所示)。
在你的 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()