Подтвердить что ты не робот

Избегайте "программы перестали работать" в С#/. NET

У меня есть консольное приложение, написанное на С#/. NET, которое я хочу запустить из script (nant). Если в консольном приложении возникает исключение, я бы хотел продолжить nant, но в Windows Vista появляется всплывающее окно, которое ищет решения и запрашивает отладки и т.д.

Я бы хотел, чтобы во всплывающем окне "программа перестала работать", когда исключение происходит в консольном приложении. Как я могу контролировать это из С#/. NET?

(Аналогичный вопрос адресует проблему для языка C, но я хотел бы получить решение для С#/. NET.)

(Чтобы уточнить: я хотел бы, чтобы исключение было передано в nant, но без всплывающего окна.)

4b9b3361

Ответ 1

Всплывающее окно отладчика JIT происходит, когда существует необработанное исключение. То есть, исключение туннелирует до стека до корня любого потока во время выполнения.

Чтобы этого избежать, вы можете обработать событие AppDomain.CurrentDomain.UnhandledException и просто вызвать Environment.Exit(1), чтобы выйти изящно.

Это будет обрабатывать все исключения во всех потоках вашего AppDomain. Если вы не делаете ничего особенного, ваше приложение, вероятно, имеет только один AppDomain, поэтому для этого в вашем методе public static void Main должно быть достаточно:

AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject);
    Environment.Exit(1);
};

Вероятно, вы также должны использовать регистратор NAnt для записи ошибки в этом случае (не можете вызвать API для этого, хотя.)

Вы также можете отключить отладку JIT на машине. Я бы рекомендовал это только в определенных обстоятельствах, например, для выделенного сервера сборки.

Ответ 2

Просто поймайте исключение и запишите его/проигнорируйте.

Ответ 3

Всплывающее окно появляется из-за необработанного исключения. Чтобы избежать этого, убедитесь, что ваш основной метод захватывает все исключения и превращает их в другую полезную информацию, которую вы можете получить. Просто игнорирование исключения не рекомендуется.

Btw помните, что исключения относятся к потоку, поэтому, если ваше приложение порождает потоки или использует потоки пулов потоков, вам также нужен обработчик.

Ответ 4

В Windows Vista вы можете отключить это диалоговое окно для своих программ.

Отключите функцию "Проблемы и решения проблем". Вы найдете его в разделе "Панель управления" → "Отчеты о проблемах и решения" → "Изменить настройки" → "Дополнительные настройки" → "Отключить" для моих программ, отчет о проблемах

Ответ 5

Обычно это происходит только тогда, когда ваше приложение не обрабатывает исключение. Если вы закроете все консольное приложение в блоке try/catch bblock и просто вернете код сбоя, вы избежите этого.