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()
4
也许您正在尝试捕获所有异常,这是在捕捉 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
import sys
from subprocess import *
try:
check_call([ 'uptime', '--help' ])
except CalledProcessError:
sys.tracebacklimit=0
print "Process failed"
raise
print "This message should never follow an error."
如果捕获到CalledProcessError,则输出将如下所示:
[me@test01 dev]$ ./foo.py
usage: uptime [-V]
-V display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1
10 回答
您可能遇到异常,程序正在退出(因为回溯) . 因此,要做的第一件事是在干净地退出之前捕获该异常(可能带有消息,给出示例) .
在
main
例程中尝试这样的事情:也许您正在尝试捕获所有异常,这是在捕捉
sys.exit()
引发的SystemExit
异常?通常,使用
except:
而不命名异常是个坏主意 . 你想要 grab - 就像SystemExit
- 它也可以掩盖你自己的编程错误 . 我上面的例子很愚蠢,除非你在清理方面做些什么 . 您可以将其替换为:如果您需要退出而不提高
SystemExit
:我这样做,在单元测试下运行的代码中调用
fork()
. 当分叉进程引发SystemExit
时,Unittest获取 . 这绝对是一个极端的案例!import sys; sys.exit(0)
之类的东西?避免使用sys.exit()代替引发异常以允许程序干净地完成是更好的做法 . 如果要关闭回溯,只需使用:
你可以在脚本的顶部设置这个以压缩所有的回溯输出,但我更喜欢使用它,例如“我知道的错误”,我希望输出是干净的,例如在文件foo.py中:
如果捕获到CalledProcessError,则输出将如下所示:
如果发生任何其他错误,我们仍然会获得完整的回溯输出 .
使用内置的python函数quit()就是这样 . 无需导入任何库 . 我正在使用python 3.4
我会这样做:
以下代码不会引发异常,并且将在没有回溯的情况下退出:
See this question and related answers了解更多详情 . 很惊讶为什么所有其他答案都如此过度简化 .
关于什么
没有追溯和某种更明确的 .