Pytanie: Chcę zdefiniować globalny moduł obsługi wyjątków dla nieobsługiwanych wyjątków w mojej aplikacji konsoli. W asp.net można zdefiniować jeden w global.asax, a w aplikacjach / usługach Windows można zdefiniować jak poniżej
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
Ale jak mogę zdefiniować globalny moduł obsługi wyjątków dla aplikacji konsoli?
currentDomain wydaje się nie działać (.NET 2.0)?
Edytować:
Argh, głupi błąd.
W VB.NET należy dodać słowo kluczowe „AddHandler” przed currentDomain, w przeciwnym razie nie zobaczysz zdarzenia UnhandledException w IntelliSense ...
To dlatego, że kompilatory VB.NET i C # traktują obsługę zdarzeń inaczej.
źródło
Console.ReadLine()
zakłóceń lub innych zakłóceń w przebiegu programu. Ale dostaję wyjątek ponownie zgłaszany raz po raz)Jeśli masz aplikację jednowątkową, możesz użyć prostej try / catch w funkcji Main, jednak nie obejmuje to wyjątków, które mogą być zgłaszane poza funkcją Main, na przykład w innych wątkach (jak zaznaczono w innych komentarze). Ten kod pokazuje, w jaki sposób wyjątek może spowodować zamknięcie aplikacji, nawet jeśli próbujesz obsłużyć go w Main (zwróć uwagę, jak program kończy działanie z wdziękiem, jeśli naciśniesz enter i zezwolisz aplikacji z wdziękiem wyjść, zanim wystąpi wyjątek, ale jeśli pozwolisz mu działać) , kończy się dość niefortunnie):
Możesz otrzymać powiadomienie, kiedy inny wątek zgłosi wyjątek, aby wykonać pewne czyszczenie przed zamknięciem aplikacji, ale o ile mogę stwierdzić, nie możesz, z aplikacji konsoli, zmusić aplikacji do kontynuowania działania, jeśli nie obsłużysz wyjątku w wątku, z którego jest wyrzucany bez użycia niejasnych opcji zgodności, aby aplikacja działała tak, jak w przypadku platformy .NET 1.x. Ten kod pokazuje, w jaki sposób główny wątek może być powiadamiany o wyjątkach pochodzących z innych wątków, ale nadal niefortunnie kończy się:
Moim zdaniem najczystszym sposobem obsługi tego w aplikacji konsolowej jest upewnienie się, że każdy wątek ma moduł obsługi wyjątków na poziomie głównym:
źródło
Musisz także obsługiwać wyjątki od wątków:
Ups, przepraszam, że dotyczyło to formularzy win. W przypadku wszystkich wątków używanych w aplikacji konsolowej będziesz musiał zawrzeć blok try / catch. Wątki w tle, które napotykają nieobsługiwane wyjątki, nie powodują zakończenia działania aplikacji.
źródło
Właśnie odziedziczyłem starą aplikację konsoli VB.NET i potrzebowałem skonfigurować Global Exception Handler. Ponieważ to pytanie wspomina VB.NET kilka razy i jest oznaczone VB.NET, ale wszystkie inne odpowiedzi tutaj są w języku C #, pomyślałem, że dodam dokładną składnię również dla aplikacji VB.NET.
Użyłem tutaj
REM
znacznika komentarza zamiast pojedynczego cudzysłowu, ponieważ Stack Overflow zdawał się lepiej obsługiwać podświetlanie składniREM
.źródło
To, co próbujesz, powinno działać zgodnie z dokumentacją MSDN dla .Net 2.0. Możesz także spróbować spróbować / złapać bezpośrednio wokół punktu wejścia do aplikacji konsoli.
A teraz Twój haczyk poradzi sobie z wszystkim, co nie zostało złapane ( w głównym wątku ). Może być pełen wdzięku, a nawet uruchomić ponownie, jeśli chcesz, lub możesz po prostu pozwolić aplikacji umrzeć i zarejestrować wyjątek. Dodałbyś wreszcie, jeśli chcesz zrobić porządki. Każdy wątek będzie wymagał obsługi wysokiego poziomu wyjątków podobnych do głównego.
Zredagowane, aby wyjaśnić punkt dotyczący wątków, jak wskazał BlueMonkMN i szczegółowo pokazał w swojej odpowiedzi.
źródło