2015-11-25 35 views
5

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)

+1

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. –

+0

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

+0

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

Odpowiedz

0

Idealnie, aby uniknąć okna "Program przestał działać", ponieważ, cóż, chcesz uniknąć warunku "program przestał działać" najpierw. Jeśli nie, jeśli chcesz tylko zarejestrować błąd i pozwolić programowi zakończyć się z gracją, program musi zakończyć się z gracją.

Po wyjściu z programu z Environment.Exit(1), prawie mówisz systemowi operacyjnemu, "hej, mam błąd!", Co jest przeciwieństwem pełnego wdzięku zakończenia. Spróbuj wyjść z kodem 0 i sprawdź, czy robi to jakąś różnicę.