Jak wyłapać wszystkie wyjątki/awarie w a.NET aplikacja [duplikat]

Możliwy duplikat:
. NET-jak najlepiej zaimplementować obsługę "catch all exceptions handler"

Mam aplikację konsoli. NET, która zawiesza się i wyświetla wiadomość dla użytkownika. Cały mój kod znajduje się w bloku try{<code>} catch(Exception e){<stuff>}, ale nadal czasami wyświetlane są błędy.

W aplikacji Win32 możesz przechwycić wszystkie możliwe wyjątki / awarie, instalując różne programy obsługi wyjątków:

/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

Jaki jest odpowiednik w świecie. NET więc mogę obsługiwać / logować / wyciszać wszystkie możliwe przypadki błędów?

Author: Community, 2008-09-17

11 answers

Wbrew temu, co napisali inni, nie ma nic złego w wyłapywaniu wszystkich wyjątków. Ważne jest, aby obchodzić się z nimi wszystkimi odpowiednio. Jeśli masz przepełnienie stosu lub stan pamięci, aplikacja powinna się dla nich wyłączyć. Należy również pamiętać, że Warunki OOM mogą uniemożliwić prawidłowe działanie obsługi wyjątków. Na przykład, jeśli funkcja obsługi wyjątków wyświetla okno dialogowe z Komunikatem o wyjątku, jeśli nie masz pamięci, może być za mało miejsca na to okno wyświetlacz. Najlepiej go zalogować i natychmiast wyłączyć.

Jak wspomnieli inni, istnieją zdarzenia UnhandledException i ThreadException, które można obsłużyć do wyjątków kolekcji, które w przeciwnym razie mogą zostać pominięte. Następnie po prostu rzuć obsługę wyjątków wokół głównej pętli(zakładając aplikację winforms).

Należy również pamiętać, że OutOfMemoryExceptions nie zawsze są wyrzucane za Warunki poza pamięcią. Warunek OOM może wyzwalać różnego rodzaju wyjątki, w kodzie lub w ramy, które nie muszą mieć nic wspólnego z faktem, że prawdziwy stan jest poza pamięcią. Często widziałem InvalidOperationException lub ArgumentException, gdy przyczyna jest rzeczywiście z pamięci.

 26
Author: Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-20 17:33:20

Możesz dodać obsługę zdarzeń do AppDomain.Zdarzenie UnhandledException i zostanie wywołane, gdy wyjątek zostanie wyrzucony, a nie przechwycony.

 43
Author: Juanma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:21:57

Ten artykuł w codeproject autorstwa naszego gospodarza Jeffa Atwooda jest tym, czego potrzebujesz. Zawiera kod do wyłapywania nieobsługiwanych wyjątków i najlepszych pratices do wyświetlania informacji o awarii użytkownikowi.

 11
Author: Ricardo Amores,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 13:46:35

The Global.Klasa asax to Twoja ostatnia linia obrony. Spójrz na:

protected void Application_Error(Object sender, EventArgs e)

Metoda

 10
Author: Drejc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:24:32

Należy pamiętać, że niektóre wyjątki są niebezpieczne do złapania-lub w większości nie do złapania,

  • OutOfMemoryException: cokolwiek zrobisz w obsłudze catch może przydzielić pamięć (po zarządzanej lub niezarządzanej stronie CLR) i w ten sposób wywołać inny OOM
  • StackOverflowException: w zależności od tego, czy CLR wykrył go wystarczająco wcześnie, możesz zostać powiadomiony. W najgorszym przypadku po prostu zabija proces.
 6
Author: Peli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:43:15

Możesz użyć AppDomain.CurrentDomain.UnhandledException, aby uzyskać wydarzenie.

 4
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:23:57

Chociaż wyłapywaniewszystkich WYJĄTKÓW bez planu właściwego postępowania z nimi jest z pewnością złą praktyką, myślę, że aplikacja powinna zawieść w jakiś wdzięczny sposób. Awaria nie powinna wystraszyć użytkownika na śmierć, a przynajmniej powinna wyświetlać opis błędu, informacje do zgłoszenia do działu pomocy technicznej, a najlepiej przycisk do zamknięcia aplikacji i ponownego uruchomienia. W idealnym świecie aplikacja powinna być w stanie zrzucić na dysk Dane użytkownika, a następnie spróbować Odzyskaj go (ale widzę, że to zbyt wiele).

W każdym razie zwykle używam:

AppDomain.CurrentDomain.UnhandledException
 4
Author: Dario Solera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 14:21:55

Możesz również skorzystać z aplikacji.Zdarzenie ThreadException.

Kiedyś rozwijałem aplikację. NET działającą wewnątrz aplikacji opartej na COM; to wydarzenie było bardzo przydatne, jako AppDomain.CurrentDomain.UnhandledException nie zadziałało w tym przypadku.

 3
Author: petr k.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:27:08

Myślę, że nie powinieneś nawet łapać wszystkich wyjątków, ale lepiej niech zostaną pokazane użytkownikowi. Powodem tego jest to, że powinieneś łapać tylko wyjątki, z którymi możesz sobie poradzić. Jeśli napotkasz jakiś wyjątek, który powoduje zatrzymanie programu, ale nadal go złapać, może to spowodować znacznie poważniejsze problemy. Przeczytaj również FAQ: dlaczego FxCop ostrzega przed catch (wyjątek)?.

 1
Author: hangy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 12:29:19

Należy pamiętać, że wyłapywanie tych nieobsługiwanych wyjątków może zmienić wymagania bezpieczeństwa aplikacji. Aplikacja może przestać działać poprawnie w pewnych kontekstach (gdy jest uruchamiana z udziału sieciowego itp.). Pamiętaj, aby dokładnie przetestować.

 1
Author: Johnny Bravado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 13:43:15

Nie zaszkodzi używać obu AppDomain.CurrentDomain.UnhandledException Podanie.ThreadException

Ale pamiętaj, że wyjątki na wątkach drugorzędnych nie są przechwytywane przez te programy obsługi; użyj SafeThread dla wątków drugorzędnych w razie potrzeby

 0
Author: Steven A. Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-20 18:05:11