Jaki jest najłatwiejszy sposób przekonwertowania wyniku Throwable.getStackTrace()
na ciąg znaków przedstawiający stacktrace?
java
stack-trace
tostring
ripper234
źródło
źródło
Odpowiedzi:
Można użyć następującej metody do konwersji
Exception
śledzenia stosuString
. Ta klasa jest dostępna w Apache commons-lang, który jest najczęściej zależną biblioteką z wieloma popularnymi otwartymi źródłamiorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
źródło
org.apache.commons.lang3.exception.ExceptionUtils
.Służy
Throwable.printStackTrace(PrintWriter pw)
do wysyłania śledzenia stosu do odpowiedniego programu piszącego.źródło
StringWriter
iPrintWriter
?To powinno działać:
źródło
printStackTrace
powinien po prostu powrócić ciąg, pozostawiając decyzję, czy wydrukować go lub nie do użytkownika :)printXXX()
powinna wypisać XXX.Jeśli tworzysz dla Androida, znacznie łatwiejszym sposobem jest skorzystanie z tego:
Format jest taki sam jak getStacktrace, np
źródło
Log.e("TAG", "My message", new Throwable());
Throwables
Klasa GuawyJeśli masz rzeczywistą
Throwable
instancję, Google Guava zapewniaThrowables.getStackTraceAsString()
.Przykład:
źródło
OSTRZEŻENIE: Nie zawiera przyczyny (która zwykle jest użytecznym bitem!)
źródło
String.format("%n")
lub coś podobnego zamiast,"\n"
aby uszczęśliwić lamery DOS.Dla mnie najczystszym i najłatwiejszym sposobem było:
źródło
źródło
StringWriter
iPrintWriter
powinny byćclose
d .... (lub chyba tylkoPrintWriter
trzeba je zamknąć, ponieważ zamknięcie powinno również zamknąćStringWriter
)Poniższy kod pozwala uzyskać cały stackTrace w
String
formacie bez użycia interfejsów API, takich jak log4J, a nawetjava.util.Logger
:źródło
Oto wersja, którą można skopiować bezpośrednio do kodu:
Lub w bloku catch
źródło
Throwable
jest zdefiniowane, prawda?To najprostszy sposób na przekonwertowanie wyniku na ciąg. Używam tego w moim programie do drukowania śladu stosu
źródło
Wydrukuj ślad stosu na a
PrintStream
, a następnie przekonwertuj go naString
:źródło
Drukowanie śladu stosu na łańcuch
Jest to przydatne, gdy chcesz wydrukować bieżący ślad stosu wątków bez tworzenia instancji
Throwable
- ale pamiętaj, że tworzenie nowegoThrowable
i uzyskiwanie śledzenia stosu z tego miejsca jest w rzeczywistości szybsze i tańsze niż wywołanieThread.getStackTrace
.źródło
Kotlin
Rozszerzenie klasy Throwable da ci właściwość String
error.stackTraceString
:źródło
źródło
Sprytne strzelanie w pierwszy zestaw komentarzy było bardzo zabawne, ale tak naprawdę zależy od tego, co próbujesz zrobić. Jeśli nie masz jeszcze właściwej biblioteki, to 3 wiersze kodu (jak w odpowiedzi D. Wróblewskiego) są idealne. OTOH, jeśli masz już bibliotekę apache.commons (jak zrobi to większość dużych projektów), to odpowiedź Amara jest krótsza. OK, uzyskanie biblioteki i zainstalowanie jej może zająć dziesięć minut (mniej niż jedna, jeśli wiesz, co robisz). Ale zegar tyka, więc możesz nie mieć czasu do stracenia. Jarek Przygódzki miał ciekawe zastrzeżenie - „Jeśli nie potrzebujesz zagnieżdżonych wyjątków”.
Ale co, jeśli nie potrzebujemy pełnych ślady stosu, zagnieżdżone i wszystkich? W takim przypadku sekret polega na użyciu getFullStackTrace apache.common (patrz http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )
Uratowało mi to bekon. Dzięki, Amar, za podpowiedź!
źródło
Kod z Apache Commons Lang 3.4 ( JavaDoc ):
Różnica w porównaniu z innymi odpowiedziami polega na tym, że używa
autoFlush
onPrintWriter
.źródło
Bez
java.io.*
tego można to zrobić w ten sposób.A potem
trace
zmienna przechowuje ślad stosu. Wyjście zawiera również przyczynę początkową, wyjście jest identyczne zprintStackTrace()
Przykład,
printStackTrace()
daje:trace
String posiada, gdy drukowanystdout
źródło
Wersja Scala
źródło
jeśli używasz Java 8, spróbuj tego
kod
getStackTrace()
funkcji można znaleźćThrowable.java
jako:a dla
StackTraceElement
dostawców totoString()
jako:Po prostu dołącz do
StackTraceElement
„\ n”.źródło
rozszerzenie odpowiedzi Gali, które obejmie również przyczyny wyjątku:
źródło
Rozwiązaniem jest konwersja stackTrace tablicy na ciąg danych typu. Zobacz następujący przykład:
źródło
Z Java 8 Stream API możesz zrobić coś takiego:
Bierze tablicę elementów śledzenia stosu, konwertuje je na ciąg i łączy w ciąg wielowierszowy.
źródło
Mój oneliner do konwersji śledzenia stosu na dołączony ciąg wielu linii:
Łatwy do przekazania do rejestratora „jak jest”.
źródło
printStackTrace()
tutaj, tracisz: 1) wyjątek, który został zgłoszony; 2) Przyczyny i ich śledzenie stosuprintStackTrace()
nigdy nie była częścią pytania.Jeśli nie chcesz korzystać z biblioteki zewnętrznej i nie tworzysz aplikacji dla systemu Android , możesz utworzyć metodę „rozszerzenia” w następujący sposób :
źródło
Stare pytanie, ale chciałbym tylko dodać specjalny przypadek, w którym nie chcesz wydrukować całego stosu , usuwając niektóre części, które tak naprawdę nie są zainteresowane, z wyłączeniem niektórych klas lub pakietów.
Zamiast
PrintWriter
użyciaSelectivePrintWriter
:Jeżeli
SelectivePrintWriter
klasę podaje:Należy pamiętać, że tę klasę można łatwo dostosować do filtrowania według Regex
contains
lub innych kryteriów. Pamiętaj też, że zależy to odThrowable
szczegółów implementacji (prawdopodobnie nie ulegnie zmianie, ale nadal).źródło
Po uruchomieniu programu wynik będzie podobny:
źródło
Zastanawiam się, dlaczego nikt nie wspomniał
ExceptionUtils.getStackFrames(exception)
Dla mnie jest to najwygodniejszy sposób na zrzucenie stacktrace ze wszystkimi jego przyczynami do końca:
źródło
Ostrzeżenie: to może być trochę nie na temat, ale no cóż ...;)
Nie wiem, jaki był pierwotny powód plakatów, że chciałem, aby ślad stosu był ciągiem. Kiedy ślad stosu powinien skończyć się w dzienniku SLF4J / Logback, ale nie było wyjątku ani nie należy go zgłaszać, oto co robię:
Podoba mi się, ponieważ nie wymaga biblioteki zewnętrznej (innej niż backend logowania, który i tak będzie przez większość czasu na miejscu).
źródło
Kilka opcji
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Korzystanie z Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
źródło