Apa cara termudah untuk mengonversi hasil Throwable.getStackTrace()
menjadi string yang menggambarkan stacktrace?
java
stack-trace
tostring
ripper234
sumber
sumber
Jawaban:
Orang dapat menggunakan metode berikut untuk mengkonversi
Exception
jejak stackString
. Kelas ini tersedia di Apache commons-lang yang merupakan pustaka dependen paling umum dengan banyak sumber terbuka yang populerorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
sumber
org.apache.commons.lang3.exception.ExceptionUtils
.Gunakan
Throwable.printStackTrace(PrintWriter pw)
untuk mengirim jejak tumpukan ke penulis yang sesuai.sumber
StringWriter
danPrintWriter
?Ini seharusnya bekerja:
sumber
printStackTrace
seharusnya hanya mengembalikan string, meninggalkan keputusan apakah mencetaknya atau tidak kepada pengguna :)printXXX()
harus mencetak XXX.Jika Anda mengembangkan untuk Android, cara yang jauh lebih mudah adalah dengan menggunakan ini:
Formatnya sama dengan getStacktrace, misalnya
sumber
Log.e("TAG", "My message", new Throwable());
Jambu biji
Throwables
KelasJika Anda memiliki
Throwable
instance aktual , Google Guava menyediakanThrowables.getStackTraceAsString()
.Contoh:
sumber
PERINGATAN: Tidak termasuk penyebab (yang biasanya sedikit berguna!)
sumber
String.format("%n")
atau sesuatu yang serupa alih-alih"\n"
untuk membuat DOS lamers senang.Bagi saya cara terbersih dan termudah adalah:
sumber
sumber
StringWriter
danPrintWriter
harusclose
d .... (atau saya kira hanyaPrintWriter
perlu ditutup karena menutupnya harus menutupStringWriter
juga)Kode berikut memungkinkan Anda untuk mendapatkan seluruh stackTrace dengan
String
format, tanpa menggunakan API seperti log4J atau bahkanjava.util.Logger
:sumber
Berikut ini adalah versi yang dapat disalin secara langsung ke dalam kode:
Atau, di blok penangkap
sumber
Throwable
didefinisikan, kan?Apakah cara termudah untuk mengubah hasilnya menjadi String Saya menggunakan ini di program saya untuk mencetak jejak tumpukan
sumber
Cetak jejak tumpukan ke
PrintStream
, lalu ubah menjadiString
:sumber
Mencetak jejak stack ke string
Ini berguna ketika Anda ingin mencetak jejak tumpukan thread saat ini tanpa membuat instance
Throwable
- tetapi perhatikan bahwa membuatThrowable
jejak stack baru dan mendapatkan dari sana sebenarnya lebih cepat dan lebih murah daripada meneleponThread.getStackTrace
.sumber
Kotlin
Memperluas kelas Throwable akan memberi Anda properti String
error.stackTraceString
:sumber
sumber
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!
sumber
Kode dari Apache Commons Lang 3.4 ( JavaDoc ):
Perbedaannya dengan jawaban lain adalah yang digunakan
autoFlush
padaPrintWriter
.sumber
Tanpa
java.io.*
itu bisa dilakukan seperti ini.Dan kemudian
trace
variabel tersebut menyimpan jejak stack Anda. Output juga memegang penyebab awal, output identik denganprintStackTrace()
Contoh,
printStackTrace()
hasil:The
trace
String memegang, saat dicetakstdout
sumber
Versi scala
sumber
jika Anda menggunakan Java 8, coba ini
Anda dapat menemukan kode untuk
getStackTrace()
fungsi yang disediakan olehThrowable.java
:dan untuk
StackTraceElement
, penyediatoString()
sebagai:Jadi gabung saja
StackTraceElement
dengan "\ n".sumber
exapansion pada jawaban Gala yang juga akan mencakup penyebab pengecualian:
sumber
Solusinya adalah mengubah stackTrace dari array ke tipe data string . Lihat contoh berikut:
sumber
Dengan Java 8 Stream API Anda dapat melakukan sesuatu seperti ini:
Ini akan mengambil array elemen jejak stack, mengubahnya menjadi string dan bergabung menjadi string multiline.
sumber
Oneliner saya untuk mengonversi tumpukan jejak ke string multi-garis terlampir:
Mudah diteruskan ke logger "apa adanya".
sumber
printStackTrace()
Di sini Anda akan kehilangan: 1) Pengecualian yang dilemparkan; 2) Penyebab dan stacktrace merekaprintStackTrace()
tidak pernah menjadi bagian dari pertanyaan.Jika Anda tidak ingin menggunakan perpustakaan eksternal dan Anda tidak mengembangkan untuk Android , Anda dapat membuat metode 'ekstensi' seperti ini:
sumber
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
PrintWriter
menggunakanSelectivePrintWriter
:Di mana
SelectivePrintWriter
kelas diberikan oleh:Harap dicatat bahwa kelas ini dapat dengan mudah disesuaikan untuk disaring oleh Regex,
contains
atau kriteria lainnya. Juga perhatikan itu tergantung padaThrowable
detail implementasi (tidak mungkin berubah, tetapi masih).sumber
Saat Anda menjalankan program, hasilnya akan serupa:
sumber
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:
sumber
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:
Saya suka karena itu tidak memerlukan perpustakaan eksternal (selain backend logging Anda, yang akan tetap ada di sebagian besar waktu, tentu saja).
sumber
Beberapa pilihan
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Menggunakan Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
sumber