2014-09-30 78 views
1

这是一个基本问题,但我找不到一个好的答案。当我需要使用stderr吗?重要的错误或所有错误?

例如,如果我使用malloc,我检查malloc,如果我看到了一个错误,我可以做:

fprintf(stderr, "Message"); 

这是一个重要的错误信息时,输出为上stderr

现在,如果我有一个程序,谁的1到5之间问号码的程序要求的用户,直到他进入好一些。

如果用户输入10,例如,是不是好东西重定向到错误消息stderr

fprintf(stderr, "Message, wrong number, try again"); 

或者这是一个正常的错误,消息应该继续stdout

+0

正确拼写'stderr'相当重要。 – usr2564301 2014-09-30 22:11:04

+0

@Jongware thx ^^' – mpgn 2014-09-30 22:12:37

+0

建议避免做'fprintf(stderr,“消息,错误的数字,再试一次”);'消息是fscanf()'的格式。最好只使用'fputs(“消息,错误号码,再试一次”,stderr);' – chux 2014-09-30 22:21:56

回答

0

请记住,标准错误不是关于错误,而是关于诊断。任何诊断消息(包括调试模式通知和花哨的进度条)都应该转到stderr,而所有的交互,无论是用户还是其他程序,都应该使用stdout。 stderr通常连接到终端,而标准输出可能是shell管道的一部分(因此不可见)。并且没有办法将stderr与stdout分开连接到下一个程序。

关于你的情况,关于错误号码的消息显然是交互的一部分,所以使用stdout。将主动对话转移到其他流是一个坏主意。但是,如果用户/对等进程不打算读取并作出反应,而只是诊断/调试程序的人的信息,则使用stderr。

+2

可以单独重定向标准错误输出。你的shell可能不会提供一个方便的语法,但是从操作系统(或者C程序员就此而言)的角度来看,它当然可以完成。 – 5gon12eder 2014-10-01 00:10:20

+0

@ 5gon12eder当然,在创建另一个进程之前,可以创建任意数量的管道。但是你没有任何标准可以涵盖这个标准,以及stderrin或其他任何名称。 – user3125367 2014-10-01 00:15:28

+0

声称“stderr总是连接到终端”是错误的。 – 5gon12eder 2014-10-01 00:17:22

3

如果您不希望要重定向某些类型的独立于其他所有输出的错误,把他们送到stderr

否则,我认为它是整个程序中保持一致,因此决定是很重要的东西去的地方,并坚持下去。

2

这取决于你如何以及何时决定使用它。

常见的应用是从任何形式的通知,是不是输出的一部分程序输出的分离,无论是错误或只是进展,以便用户知道程序没有挂什么的。

我有,例如,该获取数据的多个表以XML格式从Web服务器,转换并生成SQL转储作为输出,所以可直接将它传递给命令mysql,如在my_importer | mysql -options一个代码。在运行过程中,程序输出反馈给stderr,这样我就知道它的工作原理以及它迄今为止的输入。

0

对于像你正在讨论的交互式程序,我不认为它有很大的不同。如果程序不能用于标准输出和/或重定向的标准错误,那么也可以简化并使用标准输出来提示和诊断。

话虽如此,有很多场景中重定向是有道理的,甚至是必要的一些使用情况下正常工作。如果有任何可以想象的方式可以这样使用程序,那么确保标准输出只包含实际生产输出并且其他一切都达到标准错误是非常重要的。