Получить общую ошибку приложения Windows

Как я могу получить общие ошибки в приложении Windows или службах Windows, например Application_Error в HttpApplication


person Mehdi Hadjar    schedule 15.11.2011    source источник
comment
Вы хотите просмотреть список исключений?   -  person Abdul Munim    schedule 15.11.2011
comment
Мне нужен метод, который вызывается при возникновении ошибки в моем приложении   -  person Mehdi Hadjar    schedule 15.11.2011


Ответы (2)


Вы можете использовать следующие события для перехвата исключений в приложениях Windows Forms и службах .Net:

AppDomain.FirstChanceException

Это событие запускается всякий раз, когда в данном домене приложения возникает исключение, даже если событие обрабатывается позже. Это почти наверняка не то, что вы хотите, но я подумал, что включу его для полноты картины.

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

AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;

static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
    throw new NotImplementedException();
}

AppDomain.UnhandledException

Это событие запускается всякий раз, когда в заданном домене приложения возникает необработанное исключение. Опять же, это событие для каждого 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

person Justin    schedule 15.11.2011
comment
Обработка AppDomain.FirstChanceException — отличный инструмент разработки, поскольку он предоставляет средства проверки производительности или правильности приложения, даже если исключение было обработано. Например, вы можете зарегистрировать это событие и найти вещи, которые не на месте (странные исключения, стековые фреймы), а также вы можете пройти через этот обработчик. Также отличный способ найти хитрые ошибки, связанные с пустыми обработчиками try catch, в результате чего основное исключение фактически проглатывается, а затем код продолжается по какому-то странному пути. Обработка FCE поможет вам опередить это и может оказаться очень полезным. - person rism; 22.05.2015

Вы можете подписаться на событие UnhandledException следующим образом:

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

В вашем коде есть такой метод:

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // DoSomething
}
person Fischermaen    schedule 15.11.2011
comment
Спасибо, мне нужно было именно это событие, но где я могу подписаться на этот метод? - person Mehdi Hadjar; 15.11.2011
comment
В каждом классе вы хотите. Лучшее место - программный класс. - person Fischermaen; 15.11.2011
comment
Я должен использовать этот метод во всех классах моего проекта, чтобы получить ошибки? - person Mehdi Hadjar; 15.11.2011
comment
@MehdiHadjar: Нет, сэр, вы можете использовать его в любом классе, вы не должны использовать его ни в каком классе! Если вы новичок в C#, вам следует прочитать основы, пожалуйста. - person Fischermaen; 15.11.2011
comment
Во всяком случае, это мое первое приложение для Windows, как Джастин сказал, что я подписываюсь в методе Main в классе Program. - person Mehdi Hadjar; 15.11.2011