2015-12-02 2 views
2

У меня есть несколько программ, написанных на C# в Windows, и обратите внимание, что все они будут печатать необработанные исключения в STDERR. Я не могу найти документацию по этому поводу, что конкретно пишет исключение для STDERR? Существуют ли опции для включения/отключения этого или иного контроля над тем, как он печатает текст исключения?Почему необработанные исключения печатаются на stderr в .NET/C#?

Мне любопытно, насколько надежно .NET или C# приложение будет печатать необработанные исключения в STDERR, возможно, разработчик может использовать компилятор или другой вариант, чтобы полностью отключить эту функцию (что-то вроде Application.SetUnhandledExceptionMode), или если программа может потерпеть крах из-за необработанного исключения таким образом, чтобы он не печатался в STDERR.

ответ

7

Это было прибито около 45 лет назад, когда Кен Томпсон и другие создали Unix. Было принято писать очень маленькие программы, которые делали маленькие вещи и связывали их один за другим. Перенаправление вывода одной программы в качестве входа следующего.

Одна вещь, которая не работает так хорошо, когда вы это делаете, когда одна из этих программ выходит из строя. Отправка текста ошибки в следующую программу просто приведет к сбою в полностью неудовлетворительном виде. Поэтому нужен еще один выходной поток, который мог отображать сообщения об ошибках на терминал. Как «Не велосипед» :) Таким образом, различие между stdout и stderr.

Windows должна была принять очень похожий подход, чтобы быть хотя бы немного совместимым с большим количеством существующего программного обеспечения. Консоль - это эмуляция старых терминалов. Соответственно, .NET пишет сообщения об исключениях для stderr. Болезненно, многие программисты .NET барахтались в ProcessStartInfo.RedirectStandardXxx. Которые часто терпят неудачу, потому что они забывают перенаправлять stderr или создают тупик, потому что программа сначала считывает stdout, а затем stderr. Еще одним следствием стало нарушение кодировки текста (консоли могут поддерживать только 8-битную кодировку).

+0

Eh достаточно близко, он отвечает на титульный вопрос. Полагаю, я могу создать новые вопросы, если я хочу, чтобы те, на которые отвечал вопрос, отвечали. Похоже, я могу «полагаться» на .NET, всегда печатаю необработанный текст исключения в stderr, например, я могу контролировать приложение .NET для необработанных исключений, перенаправляя его stderr и анализируя его. – Quantic

Смежные вопросы