2009-10-21 11 views
23

A C# Program jest wywoływana przez:Czy można spróbować/złapać wokół całego programu C#?

Application.Run (new formClass()); 

Chciałbym umieścić try/catch wokół całej sprawy pułapkę żadnych niezłapane wyjątki. Kiedy umieszczam to wokół tej metody Run, wyjątki nie są wychwytywane; formant zwraca tylko tutaj, gdy program kończy się po nieprzechwyconym wyjątku.

Gdzie mogę umieścić try/catch, aby objąć cały program? Dzięki!

+4

Wydaje mi się, że brakuje ci punktu wyjątku, jeśli wyjątek jest bańką do najwyższej warstwy aplikacji, oznacza to, że coś jest nie tak, co wymaga mniejszej ingerencji w kod. Umieść try/catch wokół kodu, który Twoim zdaniem może się nie udać i złagodzenie (jeśli to możliwe) w haczyku. Jeśli nie można go złagodzić, tzn. Aplikacja nie może odzyskać danych, aplikacja musi zakończyć się niepowodzeniem. – Lazarus

+13

PO nie pyta, w jaki sposób powinny być stosowane wyjątki - po prostu jak je złapać w określonym scenariuszu. Oczywiście jeśli wyjątek jest bańką do górnej warstwy, to coś jest nie tak - wydaje się, że chce dowiedzieć się więcej informacji, gdy coś jest nie tak, więc można się do niego odnieść. Odpowiedź Mitcha jest o wiele bardziej pomocna, niż zakładanie, że op nie wie, co robi. – Maggie

+9

Złapanie wszystkich wyjątków na najwyższym poziomie może być bardzo przydatne dla podjęcia ostatecznego wysiłku w celu zgłoszenia, co się wydarzyło przed wyjściem. W wielu przypadkach wydaje mi się, że jest to lepsze niż oglądanie standardowego okna "ten program się zawiesza, proszę to zgłosić do Microsoft". – noctonura

Odpowiedz

37

Aby uchwycić nieobsługiwane wyjątki Windows Form, należy podłączyć zdarzenia AppDomain.UnhandledException i .

zainteresowania: Unexpected Errors in Managed Applications

+2

@alankdkd: Upewnij się, że przeczytałeś do końca i sekcji "Jakieś dobre praktyki";) – Lazarus

+1

Nie możesz wychwycić wyjątku z 'AppDomain.UnhandledException' (to będzie nadal kończyło aplikację), ale raczej otrzymasz powiadomienie. Jest to ważna różnica w porównaniu do 'Application.ThreadException', który jest wyjątkowym haczykiem. – Lucero

+0

Nie można uzyskać wyjątku UnhandledException. Próbowałem:

 AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
Ale gdy jest wyjątek, MyHandler nigdy nie jest wywoływany. Spróbuję ThreadException ... – user20493

8

Zasadniczo nie można złapać wszystkie wyjątki przy użyciu domyślnego CLR proces hostingu. Kropka. Wynika to z faktu, że zdarzenie AppDomain.UnhandledException jest tylko powiadomieniem, nie można obsłużyć wyjątku (co oznacza, że ​​nie można zapobiec zakończeniu aplikacji po przetworzeniu powiadomienia).

jednak można złapać i obsługiwać wszystkie wyjątki w wątku UI aplikacji WinForms używając swojego Application.ThreadException obsługi (i control the behavior poprzez UnhandledExceptionMode). Inne wątki, które rzucają wyjątek, nie zostaną przechwycone przez ten moduł obsługi.

Ogólnie rzecz biorąc, nie jest dobrym pomysłem wypróbowanie wszystkich wyjątków. Można jednak użyć funkcji AppDomain.UnhandledException w celu zarejestrowania błędu i/lub wykonania ważnych zadań związanych z czyszczeniem (np. Wyłączenie bazy danych opartej na plikach, niezależnie od tego).

Powiązane problemy