我在Windows上用C#编写了一些程序,并注意到它们都将打印未处理的STDERR异常。我找不到任何关于这个的文档,具体是什么写STDERR的例外?是否有启用/禁用此选项或以其他方式控制如何打印异常文本的选项?
我很好奇.NET或C#应用程序如何可靠地将未处理的异常打印到STDERR,开发人员可以使用编译器或其他选项来完全禁用该功能(类似于Application.SetUnhandledExceptionMode),或者如果程序由于未处理的异常而导致崩溃,并且不会打印到STDERR。
答案 0 :(得分:7)
大约45年前Ken Thompson等人创建Unix时,这种情况已经确定。习惯上写一些非常小的程序来做一些小事情并将它们一个接一个地链接起来。将一个程序的输出重定向为下一个程序的输入。
当你这样做时,有一件事情并不好用,那就是当其中一个程序失败时。将错误文本发送到下一个程序只会使其以完全不可识别的方式失败。因此需要另一个可以向终端显示错误消息的输出流。喜欢"不是自行车" :)因此stdout和stderr之间的区别。
Windows必须采用一种非常类似的方法,至少与许多现有软件兼容。控制台是旧的终端的仿真。因此,.NET将异常消息写入stderr。痛苦的顺便说一下,许多.NET程序员在ProcessStartInfo.RedirectStandardXxx上陷入困境。这经常失败,因为他们忘记重定向stderr或创建死锁,因为程序首先读取stdout然后stderr。文本编码灾难(控制台只能支持8位编码)是另一个结果。