Как я могу получить общие ошибки в приложении Windows или службах Windows, например Application_Error
в HttpApplication
Получить общую ошибку приложения Windows
Ответы (2)
Вы можете использовать следующие события для перехвата исключений в приложениях Windows Forms и службах .Net:
AppDomain.FirstChanceException
Это событие запускается всякий раз, когда в данном домене приложения возникает исключение, даже если событие обрабатывается позже. Это почти наверняка не то, что вы хотите, но я подумал, что включу его для полноты картины.
Обратите внимание, что это событие для каждого домена приложения. Если вы используете несколько доменов приложений, вам необходимо обработать это событие для каждого из них. Если у вас есть только один AppDomain (что более вероятно), то это событие будет обрабатываться следующим образом:
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
throw new NotImplementedException();
}
Это событие запускается всякий раз, когда в заданном домене приложения возникает необработанное исключение. Опять же, это событие для каждого AppDomain, и оно связано аналогично событию FirstChanceException
.
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
Вы можете перехватить эти два события в любой момент, но вы, вероятно, захотите сделать это как можно скорее, иначе могут быть выброшены исключения до того, как вы подключите обработчик событий. Начало метода Main
в вашем классе Program
обычно является подходящим местом для этого.
Обратите внимание, что в приложении Windows Forms это событие может не срабатывать, когда вы ожидаете, что необработанные исключения в приложениях Windows Forms обрабатываются по-разному (инфраструктурой Windows Forms) и поэтому иногда не распространяются как необработанные исключения в AppDomain. .
Взгляните на Почему мой блок Catch работает только во время отладки в Visual Studio?
Приложение.ThreadException
(only for Windows Forms applications)
Это происходит, когда в приложении Windows Forms генерируется необработанное исключение, которое затем перехватывается инфраструктурой Windows Forms. Вероятно, вам следует использовать это вместо AppDomain.UnhandledException
для обнаружения необработанных исключений в приложениях Windows Forms:
Application.ThreadException += Application_ThreadException;
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
throw new NotImplementedException();
}
Опять же, вы хотите подключить это как можно скорее - начало вашего метода Main
в классе Program
обычно является хорошим местом для этого.
Резюме
Обратите внимание, что ни один из них не точно похож на метод Application_Error
приложения ASP.Net, однако, если вы создаете приложение Windows Forms, вы вероятно захотите использовать Application.ThreadException
, и если вы создаете службу Windows, то вам вероятно нужно AppDomain.UnhandledException
AppDomain.FirstChanceException
— отличный инструмент разработки, поскольку он предоставляет средства проверки производительности или правильности приложения, даже если исключение было обработано. Например, вы можете зарегистрировать это событие и найти вещи, которые не на месте (странные исключения, стековые фреймы), а также вы можете пройти через этот обработчик. Также отличный способ найти хитрые ошибки, связанные с пустыми обработчиками try catch, в результате чего основное исключение фактически проглатывается, а затем код продолжается по какому-то странному пути. Обработка FCE поможет вам опередить это и может оказаться очень полезным.
- person rism; 22.05.2015
Вы можете подписаться на событие UnhandledException следующим образом:
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
В вашем коде есть такой метод:
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// DoSomething
}