Я использую 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">
можно использовать следующий метод для преобразования исключения
Stack Trace в строку
. Этот класс доступен в Apache Commons-lang, который является наиболее распространенной зависимой библиотекой со многими популярными открытыми источниками
org.apache.comMons.lang.exception.ExceptionItils.getStacktrace (молитвенный)
Расширение ответа Гала, который также будет включать причины для исключения:
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;
}
Распечатать трассировку стека в PrintStream, затем преобразовать его в строку
// ...
catch (Exception e)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(out));
String str = new String(out.toByteArray());
System.out.println(str);
}
Это должно работать:
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
Без 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)
Код из 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
.
Следующий код позволяет вам получить весь 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.
}
Throwables
Если у вас есть фактический Throwable
экземпляр, Google Guava предоставляет Throwables.getStackTraceAsString()
.
Пример:
String s = Throwables.getStackTraceAsString ( myException ) ;
Умный снайпер в первом наборе комментариев был очень забавным, но это действительно зависит от того, что ты пытаешься сделать. Если у вас еще нет правильной библиотеки, то 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 )
Это спасло мой бекон. Спасибо, Амар, за подсказку!
Печать трассировки стека в строку
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
.
С Потоковым API Java 8 можно сделать что-то вроде этого:
Stream
.of(throwable.getStackTrace())
.map(StackTraceElement::toString)
.collect(Collectors.joining("\n"));
Это возьмет массив элементов трассировки стека, преобразует их, чтобы представить в виде строки и присоединиться в многострочную строку.
ПРЕДУПРЕЖДЕНИЕ: не включает причину (обычно это полезный бит!)
public String stackTraceToString(Throwable e) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement element : e.getStackTrace()) {
sb.append(element.toString());
sb.append("\n");
}
return sb.toString();
}
Используйте 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);