2009-02-24 15 views
10

W moich aplikacjach ASP.NET zazwyczaj używam globalnej procedury obsługi zdarzeń Application_Error w celu zarejestrowania błędu i przekierowania użytkownika do strony błędu przyjaznej dla użytkownika.Obsługa błędów ASP.NET

Jednak przeczytałem o ELMAH i chociaż wydaje się to interesujące, Application_Error wydaje się być prostszym podejściem.

Czytałem inne pytania, w których ludzie, w tym ja, zasugerowali jeden lub drugi sposób. Zastanawiam się, czy istnieje jakaś znacząca korzyść z używania jednego z nich i dlaczego?

+1

Nigdy nie słyszałem o ELMAH przed ... to całkiem fajne. Będę o tym pamiętać. –

+0

+1 za wprowadzenie mnie do tej biblioteki –

Odpowiedz

8

Elmah to fantastyczny projekt i używamy go do wszystkich naszych aplikacji ASP.NET. Nie tylko rejestruje nieobsługiwane błędy, ale przechwytuje całą stronę oryginalną, którą zobaczył użytkownik, która zawiera wiele szczegółów.

Obsługuje pocztę e-mail, kanały RSS (zarówno szczegółowe, jak i skrótowe) i ma atrakcyjną konsolę.

Dla 3 wierszy w config i odniesienie dll, powiedziałbym, że jest to slam dunk.

1

Domyślam się, że główną wadą ELMAH jest to, że może to być przesada w stosunku do potrzeb. Jeśli jest to rejestrowanie i przechowywanie większej ilości informacji niż we własnej implementacji, jest to niepotrzebne obciążenie związane z przechowywaniem i przetwarzaniem. Musisz także zastanowić się, w jaki sposób zabezpieczyć dostęp do konsoli ELMAH, ponieważ szczegóły tego wyjątku mogą zawierać soczyste szczegóły Twojej aplikacji (to nie musi być trudne, ale martwisz się, że wcześniej tego nie robiłeś).

Z drugiej strony, twoja własna implementacja prawdopodobnie wzrośnie, aby zarejestrować wszystkie te dodatkowe informacje, kiedy zdecydujesz, że wymaga tego uporczywy błąd, i czy naprawdę zależy ci na ułamkach ułamków sekundy od czasu, który zajmuje dla strona błędu zostanie wyświetlona? Możliwe, że ostatecznie utworzysz własną wersję ELMAH, więc dlaczego nie po prostu użyć ELMAH i oszczędzić sobie czasu.

Polecam, jeśli chcesz napisać własne rejestrowanie błędów zamiast używać ELMAH, to przynajmniej umieść go w module, a nie bezpośrednio w Application_Error w global.asax. Wystarczy zasubskrybować zdarzenie Error zdarzenia w module Init i można łatwo ponownie wykorzystać kod obsługi błędów w innej aplikacji za pomocą linii w pliku web.config.

Również przydatna jest obsługa wszelkich rejestrów wyjątków za pośrednictwem monitorowania stanu ASP.NET. Dzięki temu można łatwo kontrolować typ i poziom logowania w pliku web.config, a także pozwala na rejestrowanie wyjątków, które zostały obsłużone przy próbie ... catch, bez przechodzenia aż do Application_Error. Stwórz niestandardową klasę HandledExceptionEvent, która rozszerza WebRequestErrorEvent, i możesz tworzyć i przenosić te zdarzenia w dowolnym bloku catch, w którym naprawdę chciałbyś wiedzieć, że wyjątek się zdarzył, mimo że został obsłużony.