【发布时间】:2016-05-29 10:50:12
【问题描述】:
我的老板让我查看一些旧代码,其中所有内容都发送到 stderr。我知道 stderr 应该有警告和错误,但是什么时候他们真的应该去 stdout 呢?
此程序是一项服务。它发送到 stderr 的一些消息是:
if pid is None:
message = "pidfile {0} is not running. \n"
sys.stderr.write(message.format(self.pidfile))
所以这是一个输出,对吧?关于成功与否的消息应该转到标准输出,因为这不是错误?
然后我又得到了一个例外:
except OSError as err:
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
sys.exit(1)
这个作为一个例外,所以应该去stderr,因为它是一个错误?还是应该去stdout,因为它只是说程序失败的输出消息?
我知道 stdout 和 stderr 是什么 --- 在问之前我读了很多。我的问题是能够识别 哪些 消息应该发送到 stderr --- 只是致命错误,还是任何类型的错误消息?
这两个示例都是错误消息,但其中一个只是“程序未运行”。我无法选择应将此类消息发送到何处。
【问题讨论】:
-
致命错误当然应该转到 stderr。正常输出应该到标准输出。信息性消息有一个灰色区域,但一般来说,如果它们会使输出不可用,它们不应该转到标准输出。人们通常会将 stdout 指向文件,将 stderr 指向终端或日志文件。所以你需要决定哪种划分最有意义。
-
@TomKarzes:将其发布为答案。比 dup Q 提供更多信息。
-
将标准输出视为您的程序执行的操作,将标准错误视为您的程序如何执行此操作。
-
程序输出的实际数据应该到标准输出,所有元数据如错误消息和进度报告应该到标准错误。所以“fork #1 failed”应该去stderr,类似“fork #1 succeeded”的东西也应该去stderr。 “pidfile {0} 未运行”也应转到 stderr。