Obsługa wyjątków in.net aplikacje internetowe

Przyznaję: nie przejmuję się zbyt dużą obsługą WYJĄTKÓW. Wiem, że powinienem zrobić więcej, ale nigdy nie mogę zawinąć głowy wokół tego, od czego zacząć i gdzie się zatrzymać. Nie jestem leniwy. Daleko mi do tego. Chodzi o to, że jestem przeciążony z wyjątkiem zajmowania się ambiwalencją. Po prostu wydaje się, że istnieje pozornie nieskończona liczba miejsc w nawet najmniejszej aplikacji, gdzie obsługa wyjątków może być zastosowana i może zacząć czuć się jak przesada.

Poradziłem sobie z dokładnym testowaniem, walidacją i cicha modlitwa, ale to zły wypadek programistyczny.

Więc, jakie są Twoje najlepsze praktyki obsługi wyjątków? W szczególności, gdzie znajdują się najbardziej oczywiste/krytyczne miejsca, w których należy zastosować obsługę wyjątków i gdzie są miejsca, w których należy je rozważyć?

Przepraszam za niejasne pytanie, ale naprawdę chcę zamknąć książkę na ten temat raz na zawsze.

Author: NakedBrunch, 2008-09-11

6 answers

Zespół Microsoft Patterns & Practices wykonał dobrą robotę, wprowadzając najlepsze praktyki zarządzania wyjątkami do biblioteki korporacyjnej Blok aplikacji obsługujących wyjątki

Event jeśli nie używasz Enterprise Library, ja wysoce zalecam zapoznanie się z ich dokumentacją. Zespół P&P opisuje typowe scenariusze i najlepsze praktyki obsługi wyjątków.

Aby zacząć polecam przeczytać następujące artykuły:

ASP.NET konkretne artykuły:

 11
Author: aku,
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-11 07:54:02

Złota reguła z obsługą WYJĄTKÓW to:

"Złap tylko to, co wiesz, jak sobie radzić"

Widziałem zbyt wiele klocków try-catch, w których haczyk nie robi nic poza tym. To nie dodaje żadnej wartości. Tylko dlatego, że wywołujesz metodę, która może rzucić wyjątek, nie oznacza, że masz do czynienia z możliwym wyjątkiem w kodzie wywołującym. Często dopuszczalne jest, aby wyjątki rozprzestrzeniały się w górę stosu wywołań do innego kodu, który wie, co robić. W niektórych przypadkach ważne jest, aby wyjątki rozprzestrzeniały się aż do warstwy interfejsu użytkownika, a następnie przechwytywały i wyświetlały wiadomość użytkownikowi. Może być tak, że żaden kod nie jest najlepiej przygotowany, aby wiedzieć, jak poradzić sobie z sytuacją, a użytkownik musi zdecydować o przebiegu działania.

 7
Author: Wheelie,
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-11 08:01:52

Polecam zacząć od dodania dobrej strony błędu, która wychwytuje wszystkie wyjątki i wyświetla użytkownikowi nieco mniej nieprzyjazny komunikat. Pamiętaj, aby zapisać wszystkie dostępne szczegóły wyjątku i skorygować je. Daj użytkownikowi znać, że to zrobiłeś i daj mu link do strony ,która będzie (prawdopodobnie) działać.

Teraz Użyj tego dziennika, aby wykryć, gdzie należy wprowadzić obsługę specjalnych WYJĄTKÓW. Pamiętaj, że nie ma sensu łapać WYJĄTKÓW, chyba że planujesz to zrobić coś z nim. Jeśli masz powyższą stronę na miejscu, nie ma sensu przechwytywać wyjątków od bazy danych indywidualnie dla wszystkich operacji db, chyba że masz jakiś konkretny sposób na odzyskanie w tym konkretnym momencie.

Pamiętaj: jedyną rzeczą gorszą od nie łapania wyjątków, jest łapanie ich i nie robienie niczego. To tylko ukryje prawdziwe problemy.

 2
Author: Magnus Akselvoll,
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-11 07:53:27

Może być bardziej o obsłudze WYJĄTKÓW w ogóle niż ASP.NET speific but:

  • Spróbuj wyłapać wyjątki jak najbliżej przyczyny, jak to możliwe, tak, że ty może rejestrować (logować) jak najwięcej informacji o wyjątku, jak to możliwe.
  • Dołącz jakąś formę catch all, last Ośrodek wypoczynkowy w punkty wejścia do twojego programu. W ASP.NET to może być Obsługa błędów na poziomie aplikacji.
  • Jeśli nie wiesz, jak "poprawnie" obsłużyć wyjątek, pozwól mu się bąbelkować do procedury catch all, gdzie można traktować ją jako" nieoczekiwany " wyjątek.
  • użyj metody Try * * * * * w. NET do takich rzeczy jak dostęp do Słownik. Pomaga to uniknąć poważnych problemy z wydajnością (wyjątek obsługa jest stosunkowo powolna) jeśli Wrzuć wiele wyjątków do say a pętla.
  • nie używaj obsługi wyjątków do kontroluj normalną logikę swojego program, np. wyjście z pętli poprzez Oświadczenie o rzucaniu.
 1
Author: Ash,
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-11 08:03:20

Zacznij od globalnej obsługi wyjątków, takiej jak http://code.google.com/p/elmah/.

Następnie pytanie sprowadza się do tego, jakiego rodzaju aplikacji piszesz i jakiego rodzaju doświadczenie użytkownika musisz zapewnić. Im więcej doświadczenia użytkownika, tym lepsza obsługa wyjątków.

Jako przykład rozważ stronę hostującą zdjęcia, która ma limity dysków, wielkości plików, wymiarów obrazów itp. Dla każdego błędu można po prostu zwrócić " An wystąpił błąd. Spróbuj ponownie". Możesz też przejść do szczegółowej obsługi błędów:

  • " Twój plik jest duży. Maksimum Rozmiar pliku to 5mb."
  • "twój obraz jest za duże. Maksymalne wymiary to 1200x1200"
  • "twój album jest pełny. Maksymalna pojemność pamięci to 1GB".
  • "wystąpił błąd z Twoim upload. Nasze hampsterzy są nieszczęśliwi. Proszę przyjść później."

Itd. itd.

Nie ma jednego rozmiaru dla wszystkich do obsługi wyjątków.

 1
Author: Todd Smith,
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-10-23 17:23:39

Cóż, na bardzo podstawowym poziomie powinieneś obsługiwać HttpApplication.Błąd zdarzenia w globalnym.plik asax. Powinno to zapisywać każdy występujący wyjątek w jednym miejscu, aby można było przejrzeć ślad stosu wyjątku.

Poza tym podstawowym poziomem powinieneś obsługiwać wyjątki, w których wiesz, że możesz je odzyskać - na przykład jeśli spodziewasz się, że plik może być zablokowany, obsługa IOException i zgłaszanie błędu użytkownikowi byłoby dobre pomysł.

 0
Author: samjudson,
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-11 07:49:35