Bagaimana saya bisa mengubah jejak tumpukan ke string?

1502

Apa cara termudah untuk mengonversi hasil Throwable.getStackTrace()menjadi string yang menggambarkan stacktrace?

ripper234
sumber
6
Karena jawaban jqno sebenarnya menggunakan metode Throwable.getStackTrace () yang Anda tentukan dalam pertanyaan Anda, sedangkan Brian tidak. Dia menggunakan Throwable.printStackTrace () sebagai gantinya.
Stijn de Witt
10
Hampir setiap proyek Java harus menyertakan Apache commons-lang. Ini mencakup banyak metode kenyamanan yang mengimplementasikan kebutuhan pengembangan yang sangat umum.
Russell Silva
20
@StijndeWitt Tiga baris kode itu hampir pasti perlu keluar dari tempat yang Anda panggil itu. Karena Anda tidak tahu di mana harus meletakkannya, mereka akan masuk ke kotak peralatan Anda dengan semua cuplikan berguna lainnya. Bingo! Anda baru saja menemukan kembali jambu biji / commons-lang / apa pun ... hanya saja tidak begitu baik. Impor pustaka utilitas yang masuk akal sebagai gantinya, dan simpan menciptakan kembali roda. Tanda sebenarnya seorang pemula berpikir Anda dapat melakukan pekerjaan yang lebih baik daripada penulis perpustakaan.
Andrew Spencer
6
1. Guava memiliki - Throwables.getStackTraceAsString (e) 2. Apache Commons Lang - ExceptionUtils.getFullStackTrace 3. Tulis metode kustom kami sendiri
user2323036
8
@AndrewSpencer Saya tidak mengerti mengapa kalian berusaha keras untuk menampar StijndeWitt karena ingin mencapai ini dengan beberapa cuplikan kecil. Benar-benar tidak banyak bahaya dalam menulis metode utilitas kecil (saya tidak melihatnya sebagai "SHEER ARROGANCE oh nooooo !! dia pikir dia lebih baik daripada Apache !!"). Ada banyak proyek terutama dalam bahasa JVM non-Jawa yang benar-benar tidak ingin memasukkan Guava atau Commons Lang hanya untuk mencatat stacktrace. Saya menulis perpustakaan Scala & Clojure dan tentu saja tidak akan menjadikan Apache Commons Lang ketergantungan transitif hanya untuk satu metode.
jm0

Jawaban:

1039

Orang dapat menggunakan metode berikut untuk mengkonversi Exceptionjejak stack String. Kelas ini tersedia di Apache commons-lang yang merupakan pustaka dependen paling umum dengan banyak sumber terbuka yang populer

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)

amar
sumber
88
@Stijn - untuk bersikap adil (saya menulis jawaban tertinggi saat ini di bawah) layak melihat commons-lang untuk fungsionalitas yang lebih banyak
Brian Agnew
54
@StijndeWitt Commons Lang cukup umum. Ini sudah ada di sebagian besar proyek / proyek saya di tempat kerja.
WhyNotHugo
16
@Hugo terima kasih, saya akan menggunakan StringWriter untuk menghindari penambahan perpustakaan baru - ternyata ini sudah menjadi ketergantungan dari 3 dependensi saya. Jadi sisanya, periksa apakah Anda sudah memilikinya.
Nathanial
33
@ MartinAsenov - mengikuti logika Anda, Anda tidak akan pernah menggunakan perpustakaan seperti itu, bukan? Anda tidak akan menggunakannya kecuali Anda sudah menggunakannya?
Brian Agnew
16
Fyi, paket telah berubah dan kelas sekarang di: org.apache.commons.lang3.exception.ExceptionUtils.
schmmd
2201

Gunakan Throwable.printStackTrace(PrintWriter pw)untuk mengirim jejak tumpukan ke penulis yang sesuai.

import java.io.StringWriter;
import java.io.PrintWriter;

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);
Brian Agnew
sumber
505
Jika Anda tidak suka menyertakan perpustakaan eksternal untuk sesuatu yang sekecil dan sesederhana ini, gunakan jawaban ini.
Stijn de Witt
8
Ini tidak memotong jejak tumpukan, dengan cara yang sama printStackTrace (). Semua pengecualian dalam stack terlihat tetapi untuk setiap pengecualian stack dapat dipangkas. Siapa pun yang membutuhkan seluruh jejak harus mempertimbangkan ini.
Laila Agaev
5
Ternyata, ini persis seperti apa yang dilakukan oleh metode ExceptionUtils.getStackTrace () apache. Sebenarnya hampir ke surat itu.
ticktock
6
@BrianAgnew, bukankah seharusnya Anda menutup StringWriterdan PrintWriter?
Muhammad Gelbana
13
@BrianAgnew, terima kasih atas jawabannya. Itu membuat saya penasaran dan inilah yang saya temukan: stackoverflow.com/questions/14542535/…
Muhammad Gelbana
459

Ini seharusnya bekerja:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
D. Wroblewski
sumber
69
Ringkas dalam konteks java selalu berbukit-bukit. Itu printStackTraceseharusnya hanya mengembalikan string, meninggalkan keputusan apakah mencetaknya atau tidak kepada pengguna :)
dmitry
35
Mencetak printStackTrace di konsol dapat diterima, tetapi setidaknya getStackTrace mengembalikannya sebagai sebuah String harus tersedia secara default
Mateus Viccari
5
Bagian mana dari ini yang ringkas? Anda harus membangun 2 objek yang ada tanpa tujuan selain untuk meletakkan jejak stack ke dalam string.
ArtOfWarfare
7
@dmitry Metode yang dipanggil printXXX()harus mencetak XXX.
Marquis of Lorne
2
@ Greg Sebenarnya itu bahkan bukan sarkasme, hanya perlu membaca apa yang dia katakan.
Andrew
224

Jika Anda mengembangkan untuk Android, cara yang jauh lebih mudah adalah dengan menggunakan ini:

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

Formatnya sama dengan getStacktrace, misalnya

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
Vicky Kapadia
sumber
2
Terima kasih. Dalam hal ini tanggal dan tag tidak ditulis di setiap baris seperti di printStackTrace ().
CoolMind
1
Sebenarnya Log.getStackTraceString pada intinya menggunakan StringWriter dan Printwriter yang disebutkan di atas (D. Wroblewski).
MikeL
2
Cara termudah untuk hanya MENCETAKnya di log Android adalah: Log.e("TAG", "My message", new Throwable());
Erick M. Sprengel
113

PERINGATAN: Tidak termasuk penyebab (yang biasanya sedikit berguna!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}
jqno
sumber
1
Saya akan pergi dengan ekstensi dari pendekatan ini jika Anda ingin memotong jejak, mis. Lulus parameter maxLines dan hanya menambahkan banyak baris ke jejak
Penjual Kaya
Tanda kurung setelah e.getStackTrace hilang. public String statis stackTraceToString (Pengecualian e) {StringBuilder sb = new StringBuilder (); untuk (elemen StackTraceElement: e.getStackTrace ()) {sb.append (element.toString ()); sb.append ("<br />"); } return sb.toString (); }
rlc
2
Tidak yakin, tapi saya pikir ini tidak akan mencetak jejak tumpukan pengecualian akar penyebab.
apoorv020
7
Apa pun yang Anda lakukan, jangan memotong jejaknya. Itu telah terjadi pada saya berkali-kali ketika saya melihat jejak tumpukan di log GlassFish yang bagian-bagian yang berguna dipangkas.
cayhorstmann
Gunakan String.format("%n")atau sesuatu yang serupa alih-alih "\n"untuk membuat DOS lamers senang.
ceving
89

Bagi saya cara terbersih dan termudah adalah:

import java.util.Arrays;
Arrays.toString(e.getStackTrace());
Vladas Diržys
sumber
37
Kode bersih, tetapi hasilnya tidak. Anda harus melakukan .replaceAll (",", "\ n") pada akhirnya. Namun Anda kehilangan lekukan yang diusulkan oleh printStackTrace.
Fury
4
Ini berguna saat Anda melacak jejak dalam satu baris
webjockey
28
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}
Akira Yamamoto
sumber
1
Hai, Saya hanya ingin menunjukkan bahwa bagian komentar dari jawaban yang dikutip menunjukkan bahwa objek StringWriterdan PrintWriterharus closed .... (atau saya kira hanya PrintWriterperlu ditutup karena menutupnya harus menutup StringWriterjuga)
Eric
8
Maksud Anda maksudnya disalin? Anda hanya memasukkannya ke dalam metode ... Membaca jawaban di sini seperti menonton "Groundhog Day"
Murmel
26

Kode berikut memungkinkan Anda untuk mendapatkan seluruh stackTrace dengan Stringformat, tanpa menggunakan API seperti log4J atau bahkan java.util.Logger:

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}
dumonderik
sumber
1
ya tapi itu agak besar bukan? dalam kerangka kerja logging proyek berukuran wajar adalah suatu keharusan jadi mengapa repot
mzzzzb
Yang ini tidak memberikan pesan kesalahan di awal. dapat ditambahkan meskipun
kommradHomer
Anda mungkin ingin menggunakan StringBuffer alih-alih penggabungan sederhana.
dedda1994
Ini berguna ketika Anda tidak diizinkan untuk mencatat pesan karena alasan privasi.
A1m
Ketahuilah bahwa solusi ini tidak akan mencatat penyebab dalam
A1m
19

Berikut ini adalah versi yang dapat disalin secara langsung ke dalam kode:

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

Atau, di blok penangkap

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}
rubel
sumber
ini akan berlanjut di luar ruang lingkup fungsi saat ini yaitu. di mana Throwabledidefinisikan, kan?
n611x007
16
Arrays.toString(thrown.getStackTrace())

Apakah cara termudah untuk mengubah hasilnya menjadi String Saya menggunakan ini di program saya untuk mencetak jejak tumpukan

LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});
Ramanan Durairaj
sumber
Bekerja untuk saya, tidak ada yang terlihat dipangkas! Lebih sederhana daripada jawaban lain juga tanpa perpustakaan eksternal, jawaban yang bagus!
Shaung Cheng
16

Cetak jejak tumpukan ke PrintStream, lalu ubah menjadi String:

// ...

catch (Exception e)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    e.printStackTrace(new PrintStream(out));
    String str = new String(out.toByteArray());

    System.out.println(str);
}
Inhalf panggang
sumber
1
ini adalah jawaban yang paling langsung
DaSqy Stc
11

Mencetak jejak stack ke string

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

Ini berguna ketika Anda ingin mencetak jejak tumpukan thread saat ini tanpa membuat instance Throwable- tetapi perhatikan bahwa membuat Throwablejejak stack baru dan mendapatkan dari sana sebenarnya lebih cepat dan lebih murah daripada menelepon Thread.getStackTrace.

Jarek Przygódzki
sumber
11

Kotlin

Memperluas kelas Throwable akan memberi Anda properti String error.stackTraceString:

val Throwable.stackTraceString: String
  get() {
    val sw = StringWriter()
    val pw = PrintWriter(sw)
    this.printStackTrace(pw)
    return sw.toString()
  }
vonox7
sumber
10
private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}
eddyrokr
sumber
1
Eddyrkokr terima kasih! Ini bekerja sempurna untuk semua clases saya. Saya baru saja menambahkannya di kelas dasar TestNG dan mengumpulkan stacktraces satu per satu dari semua tes saya!
Krzysztof Walczewski
9

Mengecam pada set komentar pertama sangat menyenangkan, tetapi itu benar-benar tergantung pada apa yang Anda coba lakukan. Jika Anda belum memiliki perpustakaan yang benar, maka 3 baris kode (seperti pada jawaban D. Wroblewski) sempurna. OTOH, jika Anda sudah memiliki perpustakaan apache.commons (seperti kebanyakan proyek besar akan), maka jawaban Amar lebih pendek. Oke, mungkin Anda butuh sepuluh menit untuk mendapatkan perpustakaan dan menginstalnya dengan benar (kurang dari satu jika Anda tahu apa yang Anda lakukan). Tetapi jam terus berdetak, jadi Anda mungkin tidak punya waktu luang. Jarek Przygódzki memiliki peringatan menarik - "Jika Anda tidak perlu pengecualian bersarang".

Tapi bagaimana jika saya tidak membutuhkan jejak stack penuh, bersarang dan semua? Dalam hal ini, rahasianya adalah menggunakan getFullStackTrace apache.common (lihat http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )

Ini menghemat daging saya. Terima kasih, Amar, untuk petunjuknya!

Tihamer
sumber
9

Kode dari Apache Commons Lang 3.4 ( JavaDoc ):

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

Perbedaannya dengan jawaban lain adalah yang digunakan autoFlush pada PrintWriter.

IvanRF
sumber
8

Tanpa java.io.*itu bisa dilakukan seperti ini.

String trace = e.toString() + "\n";                     

for (StackTraceElement e1 : e.getStackTrace()) {
    trace += "\t at " + e1.toString() + "\n";
}   

Dan kemudian tracevariabel tersebut menyimpan jejak stack Anda. Output juga memegang penyebab awal, output identik denganprintStackTrace()

Contoh, printStackTrace()hasil:

java.io.FileNotFoundException: / (Is a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at Test.main(Test.java:9)

The traceString memegang, saat dicetakstdout

java.io.FileNotFoundException: / (Is a directory)
     at java.io.FileOutputStream.open0(Native Method)
     at java.io.FileOutputStream.open(FileOutputStream.java:270)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
     at Test.main(Test.java:9)
Gala
sumber
5

Versi scala

def stackTraceToString(e: Exception): String = {
  import java.io.PrintWriter
  val sw = new StringWriter()
  e.printStackTrace(new PrintWriter(sw))
  sw.toString
}
samthebest
sumber
5

jika Anda menggunakan Java 8, coba ini

Arrays.stream(e.getStackTrace())
                .map(s->s.toString())
                .collect(Collectors.joining("\n"));

Anda dapat menemukan kode untuk getStackTrace()fungsi yang disediakan oleh Throwable.java:

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

dan untuk StackTraceElement, penyedia toString()sebagai:

public String toString() {
    return getClassName() + "." + methodName +
        (isNativeMethod() ? "(Native Method)" :
         (fileName != null && lineNumber >= 0 ?
          "(" + fileName + ":" + lineNumber + ")" :
          (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
}

Jadi gabung saja StackTraceElementdengan "\ n".

Pengcheng Zhang
sumber
Solusi ini tidak menghormati indentasi tab jejak stack jika tidak berhasil!
krizajb
4

exapansion pada jawaban Gala yang juga akan mencakup penyebab pengecualian:

private String extrapolateStackTrace(Exception ex) {
    Throwable e = ex;
    String trace = e.toString() + "\n";
    for (StackTraceElement e1 : e.getStackTrace()) {
        trace += "\t at " + e1.toString() + "\n";
    }
    while (e.getCause() != null) {
        e = e.getCause();
        trace += "Cause by: " + e.toString() + "\n";
        for (StackTraceElement e1 : e.getStackTrace()) {
            trace += "\t at " + e1.toString() + "\n";
        }
    }
    return trace;
}
ido rami
sumber
4

Solusinya adalah mengubah stackTrace dari array ke tipe data string . Lihat contoh berikut:

import java.util.Arrays;

try{

}catch(Exception ex){
    String stack = Arrays.toString(ex.getStackTrace());
    System.out.println("stack "+ stack);
}
jorge santos
sumber
4

Dengan Java 8 Stream API Anda dapat melakukan sesuatu seperti ini:

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

Ini akan mengambil array elemen jejak stack, mengubahnya menjadi string dan bergabung menjadi string multiline.

ivanjermakov
sumber
2
Solusi ini menghapus pesan dan mengabaikan semua jejak orang tua
judovana
3

Oneliner saya untuk mengonversi tumpukan jejak ke string multi-garis terlampir:

Stream.of(e.getStackTrace()).map((a) -> a.toString()).collect(Collectors.joining("\n", "[", "]"))

Mudah diteruskan ke logger "apa adanya".

Andrey Lebedenko
sumber
Anda mendapatkan sesuatu yang berbeda dari printStackTrace()Di sini Anda akan kehilangan: 1) Pengecualian yang dilemparkan; 2) Penyebab dan stacktrace mereka
valijon
Perbedaannya cukup diharapkan, karena pertobatan yang printStackTrace()tidak pernah menjadi bagian dari pertanyaan.
Andrey Lebedenko
2

Jika Anda tidak ingin menggunakan perpustakaan eksternal dan Anda tidak mengembangkan untuk Android , Anda dapat membuat metode 'ekstensi' seperti ini:

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}
Kapé
sumber
2

Pertanyaan lama, tapi saya hanya ingin menambahkan case khusus di mana Anda tidak ingin mencetak semua tumpukan , dengan menghapus beberapa bagian yang sebenarnya tidak Anda minati, tidak termasuk kelas atau paket tertentu.

Alih-alih PrintWritermenggunakan SelectivePrintWriter:

// This filters out this package and up.
String packageNameToFilter = "org.springframework";

StringWriter sw = new StringWriter();
PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); 
System.out.println(sStackTrace);

Di mana SelectivePrintWriterkelas diberikan oleh:

public class SelectivePrintWriter extends PrintWriter {
    private boolean on = true;
    private static final String AT = "\tat";
    private String internal;

    public SelectivePrintWriter(Writer out, String packageOrClassName) {
        super(out);
        internal = "\tat " + packageOrClassName;
    }

    public void println(Object obj) {
        if (obj instanceof String) {
            String txt = (String) obj;
            if (!txt.startsWith(AT)) on = true;
            else if (txt.startsWith(internal)) on = false;
            if (on) super.println(txt);
        } else {
            super.println(obj);
        }
    }
}

Harap dicatat bahwa kelas ini dapat dengan mudah disesuaikan untuk disaring oleh Regex, containsatau kriteria lainnya. Juga perhatikan itu tergantung pada Throwabledetail implementasi (tidak mungkin berubah, tetapi masih).

MarcG
sumber
1
Ya, ini bekerja dengan baik dan sebenarnya ide yang cukup berguna.
gil.fernandes
2
 import java.io.PrintWriter;
import java.io.StringWriter;

public class PrintStackTrace {

    public static void main(String[] args) {

        try {
            int division = 0 / 0;
        } catch (ArithmeticException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            System.out.println(exceptionAsString);
        }
    }
}

Saat Anda menjalankan program, hasilnya akan serupa:

java.lang.ArithmeticException: / by zero
at PrintStackTrace.main(PrintStackTrace.java:9)
Prakhar Nigam
sumber
1

Saya heran mengapa tidak ada yang menyebutkan ExceptionUtils.getStackFrames(exception)

Bagi saya ini adalah cara paling mudah untuk membuang stacktrace dengan semua penyebabnya sampai akhir:

String.join("\n", ExceptionUtils.getStackFrames(exception));
Andrey Sarul
sumber
0

Peringatan: Ini mungkin sedikit keluar dari topik, tapi oh well ...;)

Saya tidak tahu apa alasan poster asli karena ingin jejak tumpukan sebagai string di tempat pertama. Ketika jejak stack harus berakhir dengan SLF4J / Logback LOG, tapi tidak ada pengecualian atau harus dibuang di sini yang saya lakukan:

public void remove(List<String> ids) {
    if(ids == null || ids.isEmpty()) {
        LOG.warn(
            "An empty list (or null) was passed to {}.remove(List). " +
            "Clearly, this call is unneccessary, the caller should " + 
            "avoid making it. A stacktrace follows.", 
            getClass().getName(),
            new Throwable ("Stacktrace")
        );

        return;
    }

    // actual work, remove stuff
}

Saya suka karena itu tidak memerlukan perpustakaan eksternal (selain backend logging Anda, yang akan tetap ada di sebagian besar waktu, tentu saja).

Alexander Wessel
sumber