Избегайте "программа перестала работать" в C # /. NET - PullRequest
29 голосов
/ 14 сентября 2009

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

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

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

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

Ответы [ 5 ]

42 голосов
/ 14 сентября 2009

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

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

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

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

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

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

1 голос
/ 14 сентября 2009

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

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

1 голос
/ 14 сентября 2009

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

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

1 голос
/ 14 сентября 2009

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

0 голосов
/ 14 сентября 2009

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

...