Как я могу преобразовать трассировку стека в строку?

Я использую Bootstrap CSS, JS и Fonts в своем приложении. Я создал папку с именем asset в корневой директории приложения и поместил в нее всю эту папку. Затем в файле сервера добавлена ​​следующая строка:

app.use("/asset",express.static("asset"));

Эта строка позволяет мне загружать файлы, которые находятся в каталоге asset из префикса пути /asset, например: http://localhost:3000/asset/css/bootstrap.min.css.

Теперь в представлениях я могу просто включить CSS и JS, как показано ниже:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">
1389
задан james.garriss 11 March 2016 в 20:04
поделиться

13 ответов

можно использовать следующий метод для преобразования исключения Stack Trace в строку . Этот класс доступен в Apache Commons-lang, который является наиболее распространенной зависимой библиотекой со многими популярными открытыми источниками

org.apache.comMons.lang.exception.ExceptionItils.getStacktrace (молитвенный)

991
ответ дан 22 November 2019 в 20:19
поделиться

Расширение ответа Гала, который также будет включать причины для исключения:

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;
}
4
ответ дан ido flax 11 March 2016 в 20:04
поделиться

Распечатать трассировку стека в PrintStream, затем преобразовать его в строку

// ...

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

    System.out.println(str);
}
11
ответ дан Baked Inhalf 11 March 2016 в 20:04
поделиться

Это должно работать:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
436
ответ дан D. Wroblewski 11 March 2016 в 20:04
поделиться

Без java.io.* это можно сделать так.

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

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

И тогда переменная trace содержит вашу трассировку стека. Выходные данные также содержат начальную причину, выходные данные идентичны printStackTrace()

Пример, printStackTrace() приводит к:

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)

Строка trace сохраняется, когда печатается в stdout

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)
6
ответ дан Gala 11 March 2016 в 20:04
поделиться

Код из 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();
}

Разница с другими ответами в том, что он использует autoFlush на PrintWriter.

9
ответ дан IvanRF 11 March 2016 в 20:04
поделиться

Следующий код позволяет вам получить весь stackTrace в формате String, без использования таких API, как log4J или даже 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.
}
25
ответ дан Murilo Vasconcelos 11 March 2016 в 20:04
поделиться

Класс Guava Throwables

Если у вас есть фактический Throwable экземпляр, Google Guava предоставляет Throwables.getStackTraceAsString() .

Пример:

String s = Throwables.getStackTraceAsString ( myException ) ;
120
ответ дан Lonely Neuron 11 March 2016 в 20:04
поделиться

Умный снайпер в первом наборе комментариев был очень забавным, но это действительно зависит от того, что ты пытаешься сделать. Если у вас еще нет правильной библиотеки, то 3 строки кода (как в ответе Д. Вроблевского) идеальны. OTOH, если у вас уже есть библиотека apache.commons (как и большинство крупных проектов), то ответ Амара будет короче. ОК, вам может потребоваться десять минут, чтобы получить библиотеку и установить ее правильно (меньше, чем один, если вы знаете, что делаете). Но часы тикают, поэтому у вас может не быть свободного времени. У Ярека Пшигодзки была интересная оговорка: «Если вам не нужны вложенные исключения».

Но что, если мне нужно нужны полные трассы стека, вложенные и все? В этом случае секрет заключается в использовании apache.common getFullStackTrace (см. http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )

Это спасло мой бекон. Спасибо, Амар, за подсказку!

9
ответ дан Tihamer 11 March 2016 в 20:04
поделиться

Печать трассировки стека в строку

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);
        }
    }
}

Это полезно, если вы хотите напечатать текущую трассировку стека потоков без создания экземпляра Throwable - но учтите, что создание нового Throwable и получение трассировки стека из там на самом деле быстрее и дешевле, чем звонить Thread.getStackTrace.

11
ответ дан Jarek Przygódzki 11 March 2016 в 20:04
поделиться

С Потоковым API Java 8 можно сделать что-то вроде этого:

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

Это возьмет массив элементов трассировки стека, преобразует их, чтобы представить в виде строки и присоединиться в многострочную строку.

0
ответ дан Vania Shows 4 October 2019 в 07:39
поделиться

ПРЕДУПРЕЖДЕНИЕ: не включает причину (обычно это полезный бит!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}
111
ответ дан 22 November 2019 в 20:19
поделиться

Используйте 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);
2141
ответ дан 22 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: