Witam
Czy istnieje sposób na obsługę wszystkich błędów Wyjątki i awarie w aplikacji WPF? Wiem o DispatcherUnhandledException, ale obsługuje tylko wyjątki w wątku UI, prawda? Czy istnieje sposób przechwytywania i rejestrowania wszystkich wyjątków w innych wątkach? i błędy wiążące też? W jaki sposób wdrażasz tego rodzaju wymagania w swoim systemie EnterPress?Co to jest najlepsza praktyka do obsługi wszystkich wyjątków w aplikacji WPF?
Odpowiedz
Należy pamiętać, że Microsoft nie zaleca połowu wszystkie wyjątki, zamiast tego zaleca się złapać tylko wyjątki wiesz (lub spodziewać się zdarzyć w jakimś miejscu). Nawet jeśli chcesz uzyskać logo "Certified for Microsoft [Windows | Vista]", nie możesz przechwytywać nieznanych wyjątków, a takie wyjątki muszą przejść do Wer.
AppDomain.CurrentDomain.UnhandledException
Złapie nieobsługiwane wyjątki dla bieżącego wątku. Tak sobie radzimy w naszej aplikacji.
BindingErrors są zawsze obsługiwane i rejestrowane w oknie wyjściowym. Przed wydaniem sprawdzamy okno wyjściowe pod kątem błędów wiązania i naprawiamy tyle, ile możemy.
Jednak uważam, że nie chcesz traktować błędów wiązania jako nieobsługiwanych, ponieważ są one w większości odzyskiwane i powinny być naprawione najlepiej jak potrafisz przed każdym wydaniem. Możesz zmienić Debug> Exitions w Visual Studio, aby rzucić BindingFailure, aby uzyskać bardziej szczegółowe informacje.
HTH,
Dennis
Gdzie jest najlepsze miejsce do zdefiniowania obsługi zdarzeń takich, które mogą być wykryte nawet najwcześniejsze błędy? –
Można zarejestrować zdarzenie w punkcie wejścia aplikacji. Zobacz szczegóły na stronie http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx, ponieważ jest kilka rzeczy, które musisz zrozumieć. – Dennis
Tak, są 3 miejsca:
- miejsce
Application.Run()
dotry
...catch
DispatcherUnhandledException
AppDomain.CurrentDomain.UnhandledException
W obu przypadkach należy wyświetlał proszę-forgive- mi wiadomość i zasugeruj wysłanie raportu o błędzie.
Usługa na serwerze powinna odpowiadać "Dziękuję za przesłanie raportu o błędzie" lub "problem został już rozwiązany w następnej wersji. zaktualizuj”
Nie sądziłem, że 'Application.Run()' istnieje w aplikacjach WPF. – Pat
Dobry punkt do listy wszystkich miejsc. Ale upewnij się, że wszystkie są poprawne. –
Tu miła rejestrowania rozwiązanie z NLog:
Logging in .NET with NLog (default config file, catch all exceptions and route to logger, ...)
Zgadzam się, ale jeśli zrobisz wyjątek, zrób to tylko po to, aby go zarejestrować, aby znaleźć typowe błędy i poprawić je. A następnie ponownie wyrzuć wyjątek. – khebbie
Wierzę, że wspomniana przez ciebie porada Microsoftu NIE polega na wychwytywaniu wszystkich wyjątków, np. Catch Exception, z bloku try. Jednak OP wymaga rozwiązania problemu niezatrzymanych wyjątków, aby można było poradzić sobie z tą sytuacją, informując użytkownika o awarii i wysyłając zespołowi ds. Rozwoju/kontroli jakości wiadomość e-mail z raportem awarii. – Dennis
Nie, Microsoft radzi dokładnie o wychwyceniu wszystkich nieobsługiwanych wyjątków.Główną ideą, że os będzie zbierać wszystkie informacje i wysyłać raport do MS, więc MS będzie miał wszystkie statystyki dotyczące aplikacji problemowych, a programista może następnie wziąć te raporty od MS, choć Winqual. Ale oczywiście robienie niektórych logowania o nieznanym wyjątku, a następnie ponowne rzucanie jak wspomniano khebbie jest również dozwolone. – arbiter