C 我什么时候需要使用stderr?重要错误还是所有错误?
这是一个基本问题,但我找不到好答案 例如,如果我使用C 我什么时候需要使用stderr?重要错误还是所有错误?,c,stderr,C,Stderr,这是一个基本问题,但我找不到好答案 例如,如果我使用malloc,我会检查malloc,如果我看到错误,我可以执行以下操作: fprintf(stderr, "Message"); 这是一条重要的错误消息,输出在stderr上 现在如果我有一个程序询问1到5之间的数字。程序要求用户输入正确的数字 例如,如果用户输入10,将错误消息重定向到stderr,这是否好 fprintf(stderr, "Message, wrong number, try again"); 或者这是一个正常错误,并且
malloc
,我会检查malloc
,如果我看到错误,我可以执行以下操作:
fprintf(stderr, "Message");
这是一条重要的错误消息,输出在stderr
上
现在如果我有一个程序询问1到5之间的数字。程序要求用户输入正确的数字
例如,如果用户输入10,将错误消息重定向到stderr
,这是否好
fprintf(stderr, "Message, wrong number, try again");
或者这是一个正常错误,并且消息应该继续
stdout
?如果您想要独立于所有其他输出重定向某些类型的错误,请将它们发送到stderr
否则,我认为在整个程序中保持一致性是很重要的,因此,请决定要去哪里并坚持到底。如果您想要独立于所有其他输出重定向某些类型的错误,请将它们发送到
stderr
否则,我认为在整个程序中保持一致性是很重要的,因此,决定在哪里使用什么并坚持到底。这取决于您决定如何以及何时使用它 一个常见的应用程序是将程序输出与不属于输出一部分的任何类型的通知(无论是错误还是仅仅是进程)分开,以便用户知道程序没有挂起或发生任何事情
例如,我有一个代码,它从web服务器获取多个XML格式的数据表,转换并生成一个SQL转储作为输出,因此我可以将其直接传递给命令
mysql
,如myu importer | mysql-options
中所述。当操作运行时,程序将反馈输出到stderr,以便我了解它的工作情况和到目前为止导入的内容。这取决于您决定使用它的方式和时间
一个常见的应用程序是将程序输出与不属于输出一部分的任何类型的通知(无论是错误还是仅仅是进程)分开,以便用户知道程序没有挂起或发生任何事情
例如,我有一个代码,它从web服务器获取多个XML格式的数据表,转换并生成一个SQL转储作为输出,因此我可以将其直接传递给命令
mysql
,如myu importer | mysql-options
中所述。当操作运行时,程序将反馈输出到stderr,这样我就知道了它的工作原理以及它到目前为止导入的内容。请记住,stderr实际上不是关于错误,而是关于诊断。任何诊断消息(包括调试模式通知和奇特的进度条)都应该转到stderr,而所有交互,无论是用户还是其他程序,都应该转到stdout。此外,stderr通常连接到终端,而stdout可能是壳管的一部分(因此不可见)。并且无法将stderr与stdout分开连接到下一个程序
对于您的情况,关于错误号码的消息显然是交互的一部分,所以请使用stdout。将主动对话转移到其他流是个坏主意。但是,如果用户/对等进程不打算读取该信息并作出反应,而只是为诊断/调试程序的人员提供信息,那么请使用stderr 记住,stderr实际上不是关于错误,而是关于诊断。任何诊断消息(包括调试模式通知和奇特的进度条)都应该转到stderr,而所有交互,无论是用户还是其他程序,都应该转到stdout。此外,stderr通常连接到终端,而stdout可能是壳管的一部分(因此不可见)。并且无法将stderr与stdout分开连接到下一个程序
对于您的情况,关于错误号码的消息显然是交互的一部分,所以请使用stdout。将主动对话转移到其他流是个坏主意。但是,如果用户/对等进程不打算读取该信息并作出反应,而只是为诊断/调试程序的人员提供信息,那么请使用stderr 对于您正在讨论的交互式节目,我认为没有多大区别。如果无法在标准输出和/或标准错误重定向的情况下使用该程序,您还可以简化并使用标准输出进行提示和诊断
话虽如此,在许多场景中重定向是有意义的,甚至对于某些用例来说是必须的。如果您的程序有任何可以想象的方法可以这样使用,那么确保标准输出只包含实际的生产输出是非常重要的,其他所有内容都归为标准错误。对于您正在讨论的交互式程序,我认为这没有多大区别。如果无法在标准输出和/或标准错误重定向的情况下使用该程序,您还可以简化并使用标准输出进行提示和诊断
话虽如此,在许多场景中重定向是有意义的,甚至对于某些用例来说是必须的。如果有任何可以想象的方法可以这样使用您的程序,那么确保标准输出只包含实际的生产输出是非常重要的,其他所有内容都会出现标准错误。正确拼写
stderr
非常重要。建议避免使用fprintf(stderr,“消息,错误的号码,再试一次”);
其中消息是fscanf()的格式。
最好只使用fputs(“消息,错误的号码,再试一次”,stderr);
正确拼写stderr
非常重要。建议避免使用fprintf(stderr,“消息,错误的号码,再试一次”);
其中消息是fscanf()的格式。
最好只使用fputs(“消息,错误的号码,再试一次”,stderr);
可以单独重定向标准错误输出。您的shell可能没有