如何退出程序:使用 sys.stderr.write() 还是 print
我正在写一个小程序,需要多次退出这个程序。
我应该使用:
sys.stderr.write('好的,退出')
sys.exit(1)
还是直接用:
print '错误!'
sys.exit(1)
哪种方式更好,为什么?请注意,我需要这样做很多次。这个程序应该完全退出。
3 个回答
如果出现错误信息,通常应该发送到 stderr
(标准错误输出)这个地方。不过,是否真的需要这样做,得看你的具体情况。如果你希望用户能够重定向 stdin
(标准输入)、stderr
和 stdout
(标准输出),比如在用其他工具运行你的程序时,那你就需要确保状态信息和错误信息能够清晰地区分开来。
不过,如果只是你自己在用这个程序,可能就没必要太在意这些了。在这种情况下,你可以直接抛出一个异常,这样程序就会自动结束。
顺便说一下,你可以这样做:
print >>sys.stderr, "fatal error" # Python 2.x
print("fatal error", file=sys.stderr) # Python 3.x
这两种方式是用来显示消息的。
print
通常是输出到sys.stdout
,而你知道sys.stderr
是输出到哪里。了解一下stdin
、stdout
和stderr
之间的区别是很有必要的,具体可以参考这个链接。
stdout
应该用来输出正常的程序信息,而stderr
则专门用来输出错误信息(也就是程序执行不正常时的情况)。有一些工具可以将这两种输出分开,这样使用你代码的人就能区分正常输出和错误信息。
print
可以输出到任何像文件一样的对象,包括sys.stderr
:
print >> sys.stderr, 'My error message'
使用sys.stderr
来输出错误信息而不是sys.stdout
的好处有:
- 如果用户把
stdout
重定向到一个文件,他们仍然可以在屏幕上看到错误信息。 - 它是无缓冲的,所以如果
sys.stderr
被重定向到一个日志文件,程序崩溃之前记录错误的机会就更小。
值得注意的是,还有第三种方式可以提供结束消息:
sys.exit('My error message')
这会将消息发送到stderr
并退出。
sys.exit('Error!')
来自文档的说明:
如果传入了其他类型的对象,
None相当于传入零,
而任何其他对象会被打印到sys.stderr,并且会导致退出代码为1。
特别是,sys.exit("一些错误信息")是当发生错误时快速退出程序的一种方法。