W porządku, to jest łatwe:
Jaka jest różnica między
Application.ThreadException
iAppDomain.CurrentDomain.UnhandledException
?Czy muszę obsługiwać oba?
Dzięki!
źródło
W porządku, to jest łatwe:
Jaka jest różnica między Application.ThreadException
i AppDomain.CurrentDomain.UnhandledException
?
Czy muszę obsługiwać oba?
Dzięki!
Application.ThreadException jest specyficzny dla Windows Forms. Winforms uruchamia programy obsługi zdarzeń w odpowiedzi na komunikaty wysyłane do niego przez system Windows. Na przykład wydarzenie Click, jestem pewien, że je znasz. Jeśli taka procedura obsługi zdarzeń zgłasza wyjątek, w pętli komunikatów Winforms znajduje się zatrzymanie wstecz, które przechwytuje ten wyjątek.
Ten mechanizm awaryjny uruchamia zdarzenie Application.ThreadException . Jeśli go nie zastąpisz, użytkownik otrzyma ThreadExceptionDialog . Dzięki temu może zignorować wyjątek i kontynuować działanie programu. Przy okazji nie jest to świetny pomysł.
Możesz wyłączyć to zachowanie, wywołując Application.SetUnhandledExceptionMode () w metodzie Main () w Program.cs. Bez tego backstopu normalna rzecz dzieje się, gdy wątek umiera z powodu nieobsługiwanego wyjątku: zostaje wyzwolony AppDomain.UnhandledException i program się kończy.
Fwiw: „ThreadException” był bardzo złym wyborem nazwy. Nie ma to nic wspólnego z wątkami.
Application.ThreadException
. Zadałem pytanie w związku z tym [tutaj ] z moim małym kodem C #.Ze źródła :
Application.ThreadException
może zostać przechwycony, a aplikacja mogłaby kontynuować (generalnie nie jest to świetny pomysł, ale w przypadku aplikacji, takich jak okresowe uruchamianie niektórych akcji, jest to dobre rozwiązanie).Aby przechwytywać wyjątki, które występują w wątkach, które nie zostały utworzone i nie należą do Windows Forms, użyj
AppDomain.UnhandledException
. Umożliwia aplikacji rejestrowanie informacji o wyjątku, zanim domyślny program obsługi systemu zgłosi wyjątek użytkownikowi i zakończy działanie aplikacji.Obsługa tego wyjątku nie zapobiega zamknięciu aplikacji.
Maksymalnym możliwym działaniem (dane programu mogą ulec uszkodzeniu, gdy wyjątki nie są obsługiwane) jest zapisanie danych programu do późniejszego odtworzenia. Następnie domena aplikacji jest zwalniana, a aplikacja kończy się.
Aby uzyskać więcej informacji, zobacz MSDN .
źródło
OK - miałem to przed sobą, ten fragment kodu z msdn jest dość oczywisty:
źródło
Rzecz w tym, że
ThreadException
występuje z powodu problemu z twoim wątkiem,Unhandled Exception
jest uruchamiany, jeśli kod zgłasza wyjątek, który nie jest obsługiwany.Najłatwiejszym sposobem spowodowania drugiego jest utworzenie aplikacji bez bloków try ... catch i zgłoszenie wyjątku.
Teraz, jeśli potrzebujesz ubezpieczenia, możesz sobie z nimi poradzić, jednak jeśli złapiesz i obsłużysz
exceptions
poprawnie, nie powinieneś potrzebować przewodnika,UnhandledException
ponieważ jest to trochę jak złapanie wszystkiego.źródło