Jaki jest właściwy sposób, aby pokazać moje pełne InnerException
.
Okazało się, że niektóre z moich wyjątków InnerExceptions mają inny, InnerException
który jest dość głęboki.
Czy InnerException.ToString()
wykona pracę za mnie, czy muszę przejść przez pętlę InnerExceptions
i zbudować String
z StringBuilder
?
c#
exception
inner-exception
Willem
źródło
źródło
Odpowiedzi:
Możesz po prostu wydrukować
exception.ToString()
- będzie to również zawierać pełny tekst dla wszystkich zagnieżdżonych plikówInnerException
.źródło
ToString
metod dla wyjątków wewnętrznych, jak opisano szczegółowo w Dlaczego System.Exception.ToString nie wywołuje wirtualnego ToString dla wyjątków wewnętrznych? .Po prostu użyj
exception.ToString()
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
wyjątek.ToString () wywoła również funkcję .ToString () na wyjątku wewnętrznym tego wyjątku i tak dalej ...
źródło
Zwykle robię to, aby usunąć większość szumów:
Edycja: zapomniałem o tej odpowiedzi i jestem zaskoczony, że nikt nie wskazał, że możesz to zrobić
źródło
error.GetBaseException()
. Myślę, że to samo ...Odpowiedź @ Jona jest najlepszym rozwiązaniem, jeśli chcesz uzyskać pełne szczegóły (wszystkie wiadomości i ślad stosu) i zalecane.
Mogą się jednak zdarzyć sytuacje, w których potrzebujesz tylko komunikatów wewnętrznych, w takich przypadkach używam następującej metody rozszerzenia:
Często używam tej metody, gdy mam różnych słuchaczy do śledzenia i rejestrowania i chcę mieć różne poglądy na ich temat. W ten sposób mogę mieć jednego odbiornika, który wysyła cały błąd ze śladem stosu pocztą e-mail do zespołu programistów w celu debugowania przy użyciu
.ToString()
metody, oraz jednego, który zapisuje plik dziennika z historią wszystkich błędów, które zdarzały się każdego dnia bez śladu stosu z.GetFullMessage()
metodą.źródło
ex
jest aAggregateException
, żaden z wewnętrznych wyjątków nie zostanie uwzględniony w tym wynikuAby całkiem wydrukować tylko
Message
część głębokich wyjątków, możesz zrobić coś takiego:To rekursywnie przechodzi przez wszystkie wewnętrzne wyjątki (w tym przypadek
AggregateException
s), aby wypisać wszystkieMessage
zawarte w nich właściwości, rozdzielone podziałem wiersza.Na przykład
Aby uzyskać więcej informacji, należy posłuchać innych właściwości wyjątku . Na przykład
Data
będzie miał jakieś informacje. Mógłbyś:Aby uzyskać wszystkie właściwości pochodne (nie w
Exception
klasie bazowej ), możesz zrobić:źródło
IEnumerable<Exception>
zamiast twardego koduAggregrateException
do obsługi innych podobnych typów. Wykluczajp.IsSpecialName
ipi.GetIndexParameters().Length != 0
unikaj problemów.Ja robię:
To „ładnie wypisuje” wszystkie wewnętrzne wyjątki, a także obsługuje AggregateExceptions i przypadki, w których InnerException.Message jest takie samo jak Message
źródło
Jeśli chcesz uzyskać informacje o wszystkich wyjątkach, użyj
exception.ToString()
. Będzie zbierać dane ze wszystkich wyjątków wewnętrznych.Jeśli chcesz tylko oryginalny wyjątek, użyj
exception.GetBaseException().ToString()
. W ten sposób otrzymasz pierwszy wyjątek, np. Najgłębszy wyjątek wewnętrzny lub bieżący wyjątek, jeśli nie ma wyjątku wewnętrznego.Przykład:
źródło
narastanie odpowiedzi nawfala.
używając jego odpowiedzi, brakowało zmiennej aggrEx, dodałem ją.
plik ExceptionExtenstions.class:
źródło
e.StackTrace == null