Получить общую ошибку приложения Windows - PullRequest
1 голос
/ 15 ноября 2011

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

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

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

AppDomain.FirstChanceException

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

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

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

Посмотрите на Почему мой блок Catch работает только во время отладки в Visual Studio?

Application.ThreadException

(только для приложений Windows Forms)

Это происходит при возникновении необработанного исключения в приложении 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

1 голос
/ 15 ноября 2011

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

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

В вашем коде есть метод, подобный этому:

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // DoSomething
}
...