Mam kod, który się loguje Exception.Message
. Przeczytałem jednak artykuł, który mówi, że lepiej go używać Exception.ToString()
. W tym drugim przypadku zachowujesz ważniejsze informacje o błędzie.
Czy to prawda i czy można bezpiecznie zastąpić rejestrowanie kodu Exception.Message
?
Używam również układu opartego na XML dla log4net . Czy to możliwe, że Exception.ToString()
mogą zawierać nieprawidłowe znaki XML, co może powodować problemy?
Odpowiedzi:
Exception.Message
zawiera tylko komunikat (doh) powiązany z wyjątkiem. Przykład:Exception.ToString()
Sposób daje znacznie więcej komunikatów wyjściu ponownie zawierającą typ wyjątku komunikatu (sprzed), ślad stosu, a wszystkie te rzeczy zagnieżdżonych / wewnętrznych wyjątkami. Dokładniej, metoda zwraca następujące elementy:źródło
Oprócz tego, co już powiedziano, nie używaj
ToString()
obiektu wyjątku do wyświetlania użytkownikowi. WystarczyMessage
właściwość lub niestandardowy komunikat wyższego poziomu.Jeśli chodzi o rejestrowanie, zdecydowanie użyj
ToString()
wyjątku, a nie tylkoMessage
właściwości, ponieważ w większości scenariuszy będziesz drapał się w głowie, gdzie konkretnie wystąpił ten wyjątek i jaki był stos wywołań. Stacktrace powiedziałby ci to wszystko.źródło
Konwertowanie CAŁEGO wyjątku na ciąg
Dzwonienie
Exception.ToString()
daje więcej informacji niż tylko korzystanie zException.Message
właściwości. Jednak nawet to wciąż pomija wiele informacji, w tym:Data
kolekcji znaleziona we wszystkich wyjątkach.Są chwile, kiedy chcesz uchwycić te dodatkowe informacje. Poniższy kod obsługuje powyższe scenariusze. Zapisuje także właściwości wyjątków w ładnej kolejności. Używa C # 7, ale w razie potrzeby powinna być bardzo łatwa do konwersji na starsze wersje. Zobacz także tę pokrewną odpowiedź.
Najważniejsza wskazówka - wyjątki dotyczące rejestrowania
Większość osób będzie używać tego kodu do logowania. Rozważ użycie Serilog z moim pakietem Serilog.Exceptions NuGet, który rejestruje także wszystkie właściwości wyjątku, ale robi to szybciej i bez refleksji w większości przypadków. Serilog to bardzo zaawansowana platforma rejestrowania, która jest w modzie w momencie pisania.
Najlepsza wskazówka - ślady stosu czytelne dla człowieka
Możesz użyć pakietu Ben.Demystifier NuGet, aby uzyskać czytelne dla człowieka ślady stosu dla twoich wyjątków lub pakietu NuGet serilog-enrichers-demystify , jeśli używasz Serilog.
źródło
Powiedziałbym, że @Wim ma rację. Powinieneś używać
ToString()
do plików logów - zakładając odbiorców technicznych - iMessage
, jeśli w ogóle, do wyświetlania użytkownikowi. Można argumentować, że nawet to nie jest odpowiednie dla użytkownika, dla każdego typu wyjątku i każdego zdarzenia (pomyśl o ArgumentExceptions itp.).Oprócz StackTrace
ToString()
będzie również zawierać informacje, których inaczej nie uzyskasz. Na przykład wyjście syntezy jądrowej, jeśli jest włączone aby dołączyć komunikaty dziennika do wyjątku „wiadomości”.Niektóre typy wyjątków zawierają nawet dodatkowe informacje (na przykład z właściwości niestandardowych) w komunikacie
ToString()
, ale nie w nim.źródło
Zależy od potrzebnych informacji. Do debugowania przydatne są śledzenie stosu i wyjątek wewnętrzny:
źródło
Exception.ToString()
, co ci da, prawda?StringBuilder
w tym scenariuszu może być droższe niż dwa nowe przydziały ciągów, jest wysoce dyskusyjne, byłoby tu bardziej wydajne. To nie tak, że mamy do czynienia z iteracjami. Konie na kursy.Jeśli chodzi o format XML dla log4net, nie musisz się martwić ex.ToString () dla dzienników. Po prostu przekaż sam obiekt wyjątku, a log4net zajmie się resztą, podając wszystkie szczegóły w jego wstępnie skonfigurowanym formacie XML. Jedyną rzeczą, na którą czasem się natknęłam, jest formatowanie nowego wiersza, ale wtedy czytam pliki na surowo. W przeciwnym razie parsowanie XML działa świetnie.
źródło
Powiedziałbym, że to zależy od tego, co chcesz zobaczyć w logach, prawda? Jeśli jesteś zadowolony z tego, co zapewnia ex.Message, skorzystaj z tego. W przeciwnym razie użyj ex.toString () lub nawet zarejestruj ślad stosu.
źródło