2009-11-03 15 views
16

Mamy interfejs IPoller, dla którego mamy różne implementacje. Mamy proces, który zajmie IPoller i uruchomi go w osobnym wątku. Próbuję wymyślić ogólny sposób obsługi wyjątków dla wszystkich IPollerów, które same tego nie robią.Co stanie się, gdy wątek .NET zgłasza wyjątek?

Moje pierwotne myślenie polegało na stworzeniu implementacji protokołu IPoller, który akceptowałby protokół IPoller i zapewniałby tylko niektóre funkcje rejestrowania. Pytanie, na które natknąłem się, to w jaki sposób mogę zapewnić obsługę tego błędu? Jeśli mam IPoller.Start(), który jest celem dla wątku, to gdzie wystąpi wyjątek? A może jest coś na samym temacie, do którego mogę się podłączyć?

Odpowiedz

19

Coś jak:

Thread thread = new Thread(delegate() { 
    try 
    { 
     MyIPoller.Start(); 
    } 
    catch(ThreadAbortException) 
    { 
    } 
    catch(Exception ex) 
    { 
     //handle 
    } 
    finally 
    { 
    } 
}); 

Dzięki temu wyjątek nie dotrze do początku wątku.

+0

Możesz także chcieć złapać wyjątek AppDomainUnloadedException. MSDN: Wyjątek AppDomainUnloadedException jest generowany w wątku, ponieważ domena aplikacji, w której wykonywany jest wątek, jest rozładowywana. –

9

Powinieneś wychwycić wyjątek w metodzie, której używasz u góry wątku, i zrobić rejestrowanie z tego miejsca.

Nieobsługiwany wyjątek (u góry wątku) spowoduje (w wersji 2.0) wykonanie procesu. Niedobrze.

tj cokolwiek sposób przekazać do Thread.Start (etc) powinna mieć try/catch, i zrobić coś pożytecznego w catch (rejestrowanie, być może wdzięku zamykania, etc).

Aby to osiągnąć, można użyć:

  • statyczne metody rejestrowania
  • przechwyconych zmienne do delegata (jako metody anonimowej)
  • narazić swoją metodę na przykład, że już wie o rejestratorze
3

Spójrz na AppDomain.UnhandledException, to pomoże Ci przynajmniej zalogować te wyjątki, które nie są obsługi, aw niektórych przypadkach zamknąć „ładnie”:

To wydarzenie stanowi zgłoszenie Uncaught wyjątkami. Pozwala to aplikacji rejestrować informacje o wyjątku, zanim domyślny program obsługi systemu zgłosi użytkownikowi wyjątek i zakończy aplikację . Jeśli dostępna jest wystarczająca informacja o stanie aplikacji o stanie aplikacji, można podjąć inne działania, takie jak zapisanie programu danych do późniejszego odzyskania. Zalecana jest ostrożność, ponieważ dane programu mogą być uszkodzone, gdy nie są obsługiwane wyjątki .

0

Wystarczy popatrzeć na

Appdomain.FirstChanceException event

Dowiesz chwilę każdy wyjątek i CLR szuka śladu stosu. Również argumenty zdarzeń informują o typie wyjątku. Możesz uznać to za centralne miejsce do logowania.

Powiązane problemy