Если вы хотите укоротить трассировки стека, вы можете распечатать весь стек трассировки в StringWriter затем удалить то, что вы не хотите:
public static void main(String[] args) throws ParseException {
try {
throw new Exception("Argh!");
} catch (Exception e) {
System.err.println(shortenedStackTrace(e, 1));
}
}
public static String shortenedStackTrace(Exception e, int maxLines) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
String[] lines = writer.toString().split("\n");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < Math.min(lines.length, maxLines); i++) {
sb.append(lines[i]).append("\n");
}
return sb.toString();
}
в качестве альтернативы, использовать e.getStackTrace()
для получения StackTraceElement[]
массива. Это дает вам стек вызывающего абонента (от внутреннего к внешнему), но не сообщение об ошибке. Вам нужно будет использовать e.getMessage()
, чтобы получить сообщение об ошибке.
Некоторые рамки ведения журнала могут быть сконфигурированы так, чтобы автоматически усекать трассировки стека. Например. см. this question and answer о конфигурации log4j.
Если вы просто хотите увидеть трассировки стека в любой точке в коде, вы можете получить элементы из Thread.currentThread()
объекта:
Thread.currentThread().getStackTrace();
Пожалуйста, не используйте трассировки стека, чтобы узнать вызывающего метода. Это очень дорого (сравните [этот вопрос] (http://stackoverflow.com/questions/299068/how-slow-are-java-exceptions), который также имеет некоторые профилирующие данные.). Скорее используйте второй параметр и потребуйте, чтобы ваши абоненты по контракту использовали какой-то значимый идентификатор самоидентификации. – hiergiltdiestfu