2009-06-24 3 views
10

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

3

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.

+4

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

+6

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

+1

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

10
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

+0

Gdzie jest najlepsze miejsce do zdefiniowania obsługi zdarzeń takich, które mogą być wykryte nawet najwcześniejsze błędy? –

+0

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

4

Tak, są 3 miejsca:

  1. miejsce Application.Run() do try ... catch
  2. DispatcherUnhandledException
  3. 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”

+3

Nie sądziłem, że 'Application.Run()' istnieje w aplikacjach WPF. – Pat

+0

Dobry punkt do listy wszystkich miejsc. Ale upewnij się, że wszystkie są poprawne. –