Какой самый простой способ преобразовать результат Throwable.getStackTrace()
в строку, отображающую трассировку стека?
Используйте Throwable.printStackTrace(PrintWriter pw)
для отправки трассировки стека соответствующему писателю.
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);
Можно использовать следующий метод для преобразования стека в исключения
след строка
. Этот класс доступен в Коммонс-Ланг Apache, который является наиболее распространенным зависимые библиотеки с многих популярных открытых источников
орг."Апач".общин.яз.исключение.ExceptionUtils.getStackTrace(перекидным)
Это должно сработать:
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
Если вы разрабатываете для Android, гораздо проще использовать это:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
Формат такой же, как getStacktrace, например
09-24 16:09:07.042: я/системы.из(4844): Ява.яз.Исключение NullPointerException 09-24 16:09:07.042: я/системы.из(4844): на ком.темп.ttscancel.В MainActivity.метод onCreate(в MainActivity.Ява:43) 09-24 16:09:07.042: я/системы.из(4844): на Android.приложение.Деятельности.performCreate(деятельности.Ява:5248) 09-24 16:09:07.043: я/системы.из(4844): на Android.приложение.Контрольно-измерительные приборы.callActivityOnCreate(контрольно-измерительные приборы.Ява:1110) 09-24 16:09:07.043: я/системы.из(4844): на Android.приложение.ActivityThread.performLaunchActivity(ActivityThread.Ява:2162) 09-24 16:09:07.043: я/системы.из(4844): на Android.приложение.ActivityThread.handleLaunchActivity(ActivityThread.Ява:2257) 09-24 16:09:07.043: я/системы.из(4844): на Android.приложение.ActivityThread.доступ к 800$(ActivityThread.Ява:139) 09-24 16:09:07.043: я/системы.из(4844): на Android.приложение.ActivityThread$Х. handlemessage в(ActivityThread.Ява:1210) 09-24 16:09:07.043: я/системы.из(4844): на Android.ОС.Обработчик.dispatchMessage(обработчика.Ява:102) 09-24 16:09:07.043: я/системы.из(4844): на Android.ОС.Лупер.петли(лупер.Ява:136) 09-24 16:09:07.044: я/системы.из(4844): на Android.приложение.ActivityThread.основной(ActivityThread.Ява:5097) 09-24 16:09:07.044: я/системы.из(4844): на Яве.яз.отразить.Метод.invokeNative(родной способ) 09-24 16:09:07.044: я/системы.из(4844): на Яве.яз.отразить.Метод.вызов(метод.Ява:515) 09-24 16:09:07.044: я/системы.из(4844): на ком.андроид.внутренние.ОС.ZygoteInit$MethodAndArgsCaller.запустить(ZygoteInit.Ява:785) 09-24 16:09:07.044: я/системы.из(4844): на ком.андроид.внутренние.ОС.ZygoteInit.основной(ZygoteInit.Ява:601)
Throwables
классЕсли у вас есть актуальное подобное
, например, в Google гуава обеспечивает Throwables .getStackTraceAsString()
.
Пример:
String s = Throwables.getStackTraceAsString ( myException ) ;
ПРЕДУПРЕЖДЕНИЕ: Не включает причину (которая обычно является самой полезной частью!)
public String stackTraceToString(Throwable e) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement element : e.getStackTrace()) {
sb.append(element.toString());
sb.append("\n");
}
return sb.toString();
}
Для меня самый чистый и простой способ:
import java.util.Arrays;
Arrays.toString(e.getStackTrace());
public static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
Следующий код позволяет получить всю трассировки стека с формата "строка", без использования API, как к log4j или даже Ява.утиль.Логгер
:
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.
}
Вот версия, что это копия-pastable прямо на код:
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());
Или, в блоке catch
} catch (Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
logger.info("Current stack trace is:\n" + sw.toString());
}
Arrays.toString(thrown.getStackTrace())
Это самый простой способ, чтобы преобразовать результат в строку Я использую это в моей программе для печати трассировки стека
LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});
Распечатать трассировку стека в PrintStream, а затем преобразовать его в строку:
// ...
catch (Exception e)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(out));
String str = new String(out.toByteArray());
System.out.println(str);
}
Печать трассировки стека в строку
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);
}
}
}
Это's полезный, когда вы хотите напечатать текущую трассировка стека потока, не создавая экземпляр тому подобное
- но учтите, что создание новых подобное
и получение стека вызовов есть на самом деле быстрее и дешевле, чем нить звонит.getStackTrace`.
Расширение класса Throwable даст вам ошибку, строку "имущество".stackTraceString`:
val Throwable.stackTraceString: String
get() {
val sw = StringWriter()
val pw = PrintWriter(sw)
this.printStackTrace(pw)
return sw.toString()
}
private String getCurrentStackTraceString() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
return Arrays.stream(stackTrace).map(StackTraceElement::toString)
.collect(Collectors.joining("\n"));
}
Умный снайперов в первых комментариях было очень забавно, но это действительно зависит от того, что вы пытаетесь сделать. Если вы Don'т уже имеют правильные библиотеки, то 3 строки кода (как в д. Врублевский'ы ответ) идеально подходит. Ото, если у вас уже есть "Апач".библиотека Коммонс (как наиболее крупные проекты), затем Амар'ы ответ короче. ОК, это может занять десять минут, чтобы войти в библиотеку и установите его правильно (меньше, чем один, если вы знаете, что вы'повторно делать). Но часы тикают, так что вы не можете иметь время, чтобы сэкономить. Ярек Przygódzki был интересный нюанс--"Если вы не'т нужна вложенных исключений и".
Но что, если я не нуждаются в полной трассировки стека, вложенного и все? В этом случае, секрет в том, чтобы использовать Apache.общие'ы getFullStackTrace (см. http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html#getFullStackTrace%28java.lang.Throwable%29)
Это спасло мою шкуру. Спасибо, Амар, за подсказку!
Код от Апач Викискладе Ланг 3.4 (документации):
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();
}
Разница с другими ответами, что используется автосброс
на издания
.
Без Явы.Ио.*` это может быть сделано, как это.
String trace = e.toString() + "\n";
for (StackTraceElement e1 : e.getStackTrace()) {
trace += "\t at " + e1.toString() + "\n";
}
А затем "след" переменная содержит ваш стек трассировки. Выход также имеет первопричину, выход идентичен печатные()
Например, печатные()
дает:
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)
Этот "след" веревочку держит, когда напечатал в стандартный вывод
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)
если вы используете Java 8, то попробуйте это
Arrays.stream(e.getStackTrace())
.map(s->s.toString())
.collect(Collectors.joining("\n"));
вы можете найти код для getStackTrace () функцияпредусмотрено
Throwable.java` как :
public StackTraceElement[] getStackTrace() {
return getOurStackTrace().clone();
}
и для StackTraceElement, ИТ
метод toString()` как:
public String toString() {
return getClassName() + "." + methodName +
(isNativeMethod() ? "(Native Method)" :
(fileName != null && lineNumber >= 0 ?
"(" + fileName + ":" + lineNumber + ")" :
(fileName != null ? "("+fileName+")" : "(Unknown Source)")));
}
Так что просто присоединяйтесь к StackTraceElement
с "\П" по.
в exapansion на гала'ы ответьте, что также будет включать в себя причины для исключения:
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;
}