Przeczytałem in this post, aby uniknąć okno dialogowe "Program przestał działać", muszę złapać nieobsługiwany wyjątek od AppDomain.Catch nieobsługiwany wyjątek, nadal wyświetla okno dialogowe "program przestał działać"
public Form1()
{
///Code
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
///more code
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var excep = e.ExceptionObject;
//Writing the exception to log file with the stack flow
Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this);
//Terminate the logger (manual event waiting for file write to finish)
Logger.Logger.Terminate();
Environment.Exit(1);
}
Ale kiedy dostaję wdychany wyjątek. Widzę to zapisane w logu, ale aplikacja pokazuje okno "program przestał działać". może to być spowodowane linią Logger.Terminate
? (ponownie - polecenie zakończenia czeka, aż wszystkie dzienniki zostaną zapisane w pliku dziennika)
Możliwe, że twój przewodnik obsługi również ulegnie awarii. Ta metoda Terminate() brzmi dość ryzykownie. Nawet Environment.Exit() może zawieść, nadal uruchamia finalizatory. Lub coś głupiego jak błąd w klasie Logger, nie będzie lepiej, gdy użyjesz go w procedurze obsługi zdarzeń. Ogólnie rzecz biorąc, coś nieprzyjemnego wydarzyło się w twoim programie, więc szanse na destabilizację twojego programu obsługi zdarzeń też nie są zerowe. Jesteś również dość późno subskrybujący wydarzenie, powinno to być zrobione w metodzie Main() zanim zrobisz cokolwiek innego. –
Jest również możliwe, że program obsługi zdarzeń nie zostanie wywołany. Niektóre wyjątki ('StackOverflowException') mogą przerwać cały proces, zanim jakikolwiek przewodnik otrzyma szansę uruchomienia. – hvd
Guys - Widzę nieobsługiwany wyjątek w pliku dziennika, a także finilizing pliku dziennika. więc to wydarzenie zostanie przetworzone. Również mam w głównej tej samej catch zdarzenia na wyjątku wątku (dzięki!) – Izikon