Konvertere en stakksporing til en streng i Java
1. Introduksjon
Når vi arbeider med unntak i Java, logger vi ofte eller viser bare stakkspor. Noen ganger vil vi imidlertid ikke bare skrive ut stack-trace, vi kan trenge å skrive stack-trace til en fil, til en database eller til og med overføre den over nettverket.
For disse formål, å ha stablespor som en String ville være veldig nyttig. Dessverre gir Java ikke en veldig praktisk metode for å gjøre det direkte.
2. Konvertering med Core Java
La oss starte med kjernebiblioteket.
Funksjonen printStackTrace () av Unntak klasse kan ta en parameter, enten a PrintStream eller a PrintWriter. Dermed er det mulig å bruke en StringWriter, for å skrive ut bunnspor i a String:
StringWriter sw = ny StringWriter (); PrintWriter pw = ny PrintWriter (sw); e.printStackTrace (pw);
Så ringer sw.toString () vil returnere stakksporingen som en String.
3. Konvertering med Commons-Lang
Mens den forrige metoden er den enkleste måten å konvertere en stack-spor til a String bruker kjernen Java, er det fortsatt litt tungvint. Heldigvis tilbyr Apache Commons-Lang en funksjon som gjør jobben.
Apache Commons-Lang er et veldig nyttig bibliotek som tilbyr mange funksjoner som mangler i kjerneklassene i Java API, inkludert klasser som kan brukes til å arbeide med unntakene.
Først, la oss starte med prosjektkonfigurasjonen. Når du bruker Maven, må vi bare legge til følgende avhengighet til pom.xml:
org.apache.commons commons-lang3 3.5
Så, i vårt tilfelle, er den mest interessante klassen UnntakUtils, som gir funksjoner for å manipulere unntakene. Ved å bruke denne klassen får du stabelsporet som en String fra en Unntak er ganske grei:
String stacktrace = ExceptionUtils.getStackTrace (e);
4. Konklusjon
Å få stabelspor av et unntak som en String er ikke vanskelig, men det er langt fra å være intuitivt. Denne artikkelen presenterer to måter å gjøre det på, enten ved hjelp av Java-kjerne eller Apache Commons-Lang.
Husk at Java 9 vil bringe et nytt StackWalking API som skal gjøre ting enklere.
Som alltid kan kodeeksemplene finnes her på GitHub.