У меня есть рабочее приложение WPF, которое заполняет журнал событий приложений Windows ошибками AppCrash из-за исключения System.ObjectDisposedException. AppCrash специально указывает на мое приложение, SampleApplication.exe. Кроме того, приложение работает в системе, которая не может быть подключена к сети (поэтому нет возможности удаленной отладки), и мне трудно найти проблему.
У меня есть два обработчика событий для захвата и записи всех необработанных исключений. Они работают для всех других исключений. Я не уверен, как эти System.ObjectDisposedExceptions не перехватываются до того, как они попадают в журнал событий, а также почему приложение фактически не падает. Он продолжает работать очень хорошо.
Вот обработчики событий исключений приложения и конструктор App, который их подключает:
public App() : base()
{
System.Windows.Application.Current.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
}
void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message);
Console.WriteLine(e.Exception.StackTrace);
LogException(e.Exception);
e.Handled = true;
}
void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
if (unhandledExceptionEventArgs.ExceptionObject is Exception)
{
var e = (Exception)unhandledExceptionEventArgs.ExceptionObject;
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
LogException((Exception)unhandledExceptionEventArgs.ExceptionObject);
}
}
void LogException(Exception e)
{
Exception tmp = e;
while (tmp.InnerException != null)
tmp = tmp.InnerException;
string errorMessage = string.Format("An unhandled exception occurred: {0}", tmp.Message);
System.Windows.MessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
EventLogService.AddLog(EventLogSourceTypes.Error, errorMessage, DateTime.UtcNow, e.StackTrace);
}
Я не уверен, что они даже имеют отношение к моему вопросу, а именно:
Как я могу поймать эти исключения и документировать детали вместо того, чтобы заполнять журнал событий приложений Windows? И приложение продолжает нормально работать, поэтому, несмотря на то, что они являются записями AppCrash, приложение фактически не падает.