Консольное приложение C# – предотвратить диалоговое окно исключения по умолчанию
-
20-08-2019 - |
Вопрос
У меня есть простое приложение с одним AppDomain, которое периодически запускается на сервере.Иногда в приложении возникает необработанное исключение, и появляется диалоговое окно прерывания/повторения/игнорирования по умолчанию.Мне нужно как-то запретить отображение edialog, просто вывести исключение на StrErr и закрыть приложение.Поэтому я включил весь код в основной метод с помощью оператора try-catch, но это совсем не помогло - иногда диалог исключений все еще отображается.
Код Main() выглядит следующим образом:
try
{
RunApplication();
}
catch (Exception exc)
{
Console.Error.WriteLine(exc.ToString());
Console.Error.WriteLine(exc.StackTrace);
if (exc.InnerException != null)
{
Console.Error.WriteLine(exc.InnerException.ToString());
Console.Error.WriteLine(exc.InnerException.StackTrace);
}
Environment.Exit(666);
}
Это предложение try-catch должно перехватывать все необработанные исключения, и диалоговое окно исключения никогда не должно появляться AFAIK.Я что-то пропустил?Или есть ли на сервере какая-либо настройка (реестр и т. д.), которая управляет каким-то особым поведением, связанным с кодом ошибки диалога исключения/приложения?
Решение
Существует необработанное событие исключения, на которое вы можете подписаться в домене приложения.
public static void Main()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
//some code here....
}
/// <summary>
/// Occurs when you have an unhandled exception
/// </summary>
public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//here's how you get the exception
Exception exception = (Exception)e.ExceptionObject;
//bail out in a tidy way and perform your logging
}
Другие советы
Рассматривали ли вы возможность того, что ваш пункт catch может генерировать исключения?Вы создаете темы в своем основном приложении?