【问题标题】:Why are unhandled exceptions printed to stderr in .NET/C#?为什么在 .NET/C# 中将未处理的异常打印到 stderr?
【发布时间】:2020-02-08 04:46:26
【问题描述】:

我有几个在 Windows 上用 C# 编写的程序,注意到它们都会将未处理的异常打印到 STDERR。我找不到任何关于此的文档,具体是什么向 STDERR 写入异常?是否有启用/禁用此功能或以其他方式控制它如何打印异常文本的选项?

我很好奇 .NET 或 C# 应用程序如何可靠地将未处理的异常打印到 STDERR,也许开发人员可以使用编译器或其他选项来完全禁用该功能(类似于 Application.SetUnhandledExceptionMode),或者如果程序可能会由于未处理的异常而崩溃,并且不会打印到 STDERR。

【问题讨论】:

    标签: c# .net windows


    【解决方案1】:

    这是在大约 45 年前 Ken Thompson 等人创建 Unix 时确定的。习惯于编写非常小的程序来做一些小事情并将它们一个接一个地链接起来。将一个程序的输出重定向为下一个程序的输入。

    执行此操作时效果不佳的一件事是当其中一个程序失败时。将错误文本发送到下一个程序只会使其以完全无法诊断的方式失败。所以需要另一个输出流来向终端显示错误消息。就像“不是自行车” :) 因此 stdout 和 stderr 之间的区别。

    Windows 必须采用非常相似的方法才能至少与许多现有软件有一点兼容。控制台是旧终端的仿真。因此,.NET 将异常消息写入标准错误。痛苦的顺便说一句,许多 .NET 程序员在 ProcessStartInfo.RedirectStandardXxx 中挣扎。这通常会失败,因为他们忘记重定向 stderr 或创建死锁,因为程序首先读取 stdout 然后读取 stderr。文本编码灾难(控制台只能支持 8 位编码)是另一个后果。

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2011-10-24
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多