Избегайте "программы перестали работать" в С#/. NET
У меня есть консольное приложение, написанное на С#/. NET, которое я хочу запустить из script (nant). Если в консольном приложении возникает исключение, я бы хотел продолжить nant, но в Windows Vista появляется всплывающее окно, которое ищет решения и запрашивает отладки и т.д.
Я бы хотел, чтобы во всплывающем окне "программа перестала работать", когда исключение происходит в консольном приложении. Как я могу контролировать это из С#/. NET?
(Аналогичный вопрос адресует проблему для языка C, но я хотел бы получить решение для С#/. NET.)
(Чтобы уточнить: я хотел бы, чтобы исключение было передано в nant, но без всплывающего окна.)
Ответы
Ответ 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 и просто вернете код сбоя, вы избежите этого.