2011-07-25 1 views
55

Bir istisnanın yığın izini stderr dışındaki bir akışa nasıl yazdırabilirim? Bulduğum yollardan biri getStackTrace() kullanmak ve tüm listeyi akışa yazdırmaktır.Özel durumun yığın izini yazdırma

+0

Eğer bir String birleştirebilirsiniz StackTraceElement' nesnelerin 'dizisi döndürür Trowable (İstisna) ait getStackTrace' yöntemi' çağırabilirsiniz (toString yöntemini kullanarak Bu nesne bir iz bir satır elde etmek için). – jcubic

cevap

46

Throwable.printStackTrace(..) bir PrintWriter veya PrintStream argüman alabilir: bahsedilen

} catch (Exception ex) { 
    ex.printStackTrace(new PrintStream(yourOutputStream)); 
} 

, LOGBack veya log4j gibi bir günlük uygulaması ile SLF4J gibi bir logger arayüzünü kullanmayı düşünün.

2

Throwable sınıfı printStackTrace adlandırılan iki yöntem, söz konusu akışına yığın izleme çıktılar bir PrintStream alır bir PrintWriter ve bir kabul eden bir sağlar. Bunlardan birini kullanmayı düşünün.

56

Baskı akışı bir argüman olarak alan alternatif bir Throwable.printStackTrace() biçimi vardır. ILLUSTRATORNG.

catch(Exception e) { 
    e.printStackTrace(System.out); 
} 

Bu, yığın izini std hatası yerine std olarak yazdırır.

+3

@FranklinYu, sorunun tam noktası, stderr'e değil, başka bir rastgele akışa yazdırmak istememesi. –

61

güzel değil, ama yine de bir çözüm:

StringWriter writer = new StringWriter(); 
PrintWriter printWriter = new PrintWriter(writer); 
exception.printStackTrace(printWriter); 
printWriter.flush(); 

String stackTrace = writer.toString(); 
+3

İhtiyacım olan budur (bunu kullanarak gerçekten kirli hissediyorum bile!) –

1

android dev minimalistlere için javadoc

out = some stream ... 
try 
{ 
} 
catch (Exception cause) 
{ 
     cause . printStrackTrace (new PrintStream (out)) ; 
} 
8

bakınız: Log.getStackTraceString(exception)

+1

Bunu rastgele bir akışa yazdırmak için kullanamazsınız. Sadece yapılandırılmış bir kaydediciniz varsa yararlıdır. –

+0

Bu, Android geliştirme için harika çalışıyor. Teşekkürler! – wyzkid207

+0

Bu minimalist yaklaşımı sevdim ama slf4j :(ile jell yapmadı – killjoy

2

Ben stackTrace

alma konusunda yardımcı olan bir yöntem var
private static String getStackTrace(Exception ex) { 
    StringBuffer sb = new StringBuffer(500); 
    StackTraceElement[] st = ex.getStackTrace(); 
    sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n"); 
    for (int i = 0; i < st.length; i++) { 
     sb.append("\t at " + st[i].toString() + "\n"); 
    } 
    return sb.toString(); 
Eğer dize olarak istisna izini almak istiyorsanız

}