sor*_*rin 270 python exit traceback
我想知道如何退出Python而不在输出上有回溯转储.
我仍然希望能够返回错误代码,但我不想显示回溯日志.
我希望能够在exit(number)没有跟踪的情况下退出,但是在异常(不是退出)的情况下,我想要跟踪.
jkp*_*jkp 288
您可能遇到异常,程序正在退出(因为回溯).因此,要做的第一件事是在干净地退出之前捕获该异常(可能带有消息,给出示例).
在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()
Run Code Online (Sandbox Code Playgroud)
bst*_*rre 80
也许你正在尝试捕获所有异常,这是抓住了SystemExit由异常引发的异常sys.exit()?
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
Run Code Online (Sandbox Code Playgroud)
通常,在except:不命名异常的情况下使用是一个坏主意.你会发现你不想捕捉的各种东西 - 比如SystemExit- 它也可以掩盖你自己的编程错误.我上面的例子很愚蠢,除非你在清理方面做些什么.您可以将其替换为:
import sys
sys.exit(1) # Or something that calls sys.exit().
Run Code Online (Sandbox Code Playgroud)
如果您需要退出而不提高SystemExit:
import os
os._exit(1)
Run Code Online (Sandbox Code Playgroud)
我这样做,在单元测试和调用下运行的代码fork().当分叉进程提升时,Unittest获取SystemExit.这绝对是一个极端的案例!
类似的东西import sys; sys.exit(0)?
以下代码不会引发异常,并且将在没有回溯的情况下退出:
import os
os._exit(1)
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此问题和相关答案.很惊讶为什么所有其他答案都如此过度简化.
避免使用sys.exit()代替引发异常以允许程序干净地完成是更好的做法.如果要关闭回溯,只需使用:
sys.trackbacklimit=0
Run Code Online (Sandbox Code Playgroud)
您可以在脚本顶部设置此项以压缩所有回溯输出,但我更喜欢使用它,例如"已知错误",我希望输出是干净的,例如在文件foo.py中:
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."
Run Code Online (Sandbox Code Playgroud)
如果捕获到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
Run Code Online (Sandbox Code Playgroud)
如果发生任何其他错误,我们仍然会获得完整的回溯输出.
| 归档时间: |
|
| 查看次数: |
585093 次 |
| 最近记录: |