2016-07-12 4 views
0

Я работаю над очень большим C# -приложением. Один слишком большой, чтобы идти и поймать все возможные необработанные исключения.C# Предотвратить запуск приложения при нажатии кнопки «Выход из окна UnhandledException»

Приложение также имеет «Вы уверены, что хотите уйти?» сообщение появляется в событии FormClosing приложения.

Когда выполняются необработанные исключения, иногда пользователи нажимают кнопку «Выход». Я считаю, что это вызывает Application.Exit() или какую-то форму. Это также вызывает событие FormClosing и всплывающее окно.

Sample Unhandled exception dialog box

На данный момент она не имеет значения, вы щелкаете да или нет на всплывающем окне. Приложение выйдет после получения ответа из-за Application.Exit().

Есть ли все-таки предотвратить использование приложения.Exit()?

+3

Обращайтесь с 'UnhandledException', чтобы вы могли полностью заменить диалог. – SLaks

+0

Каков ваш код? Как мы можем предложить вам ответ, не зная ваш стиль кодирования! – mostafa8026

+1

Как вам удалось создать большое приложение, не обращая внимания даже на основную обработку ошибок? –

ответ

1

Если вам нужно предотвратить прекращение действия приложения, вам необходимо обработать исключение. Разумно иметь try..catch в любом месте, которое может вызвать исключение (их должно быть не много). Однако для этого есть глобальное событие.

Если исключение в основного потока не обрабатываются и распространяется на исключение AppDomain необработанного, то приложение не в допустимом состоянии и должен terminate. Последняя надежда на этом этапе состоит в том, чтобы регистрировать информацию об исключениях и пытаться сохранить то, что может быть сохранено до того, как приложение будет прекращено навсегда.

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

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // we can log info from e.ExceptionObject and check e.IsTerminating 
} 

In the .NET Framework versions 1.0 and 1.1, an unhandled exception that occurs in a thread other than the main application thread is caught by the runtime and therefore does not cause the application to terminate. Thus, it is possible for the UnhandledException event to be raised without the application terminating. Starting with the .NET Framework version 2.0, this backstop for unhandled exceptions in child threads was removed, because the cumulative effect of such silent failures included performance degradation, corrupted data, and lockups, all of which were difficult to debug. For more information, including a list of cases in which the runtime does not terminate, see Exceptions in Managed Threads .

Вы также может понадобиться для обработки:

Application.ThreadException += Application_ThreadException; 
Смежные вопросы