Fetch only first N lines of a Stack Trace
我有一个从ID调用返回对象的工厂方法。
模拟代码:
1 2 3 4 5 6 7 8 |
如何只显示堆栈跟踪的前n行(这样我就知道了方法的调用方),而不将整个堆栈跟踪转储到日志中,或者不必依赖外部libs?
根据你的要求,我假设你没有例外。在这种情况下,您可以从以下位置获取当前堆栈跟踪:
1 |
这将告诉你在代码中你需要知道的关于你从哪里来的几乎所有信息。
您可以使用
1 2 | StackTraceElement[] elements = ex.getStackTrace(); print(elements[0]); |
。
此方法显示堆栈跟踪的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public static String traceCaller(Exception ex, int i) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); StringBuilder sb = new StringBuilder(); ex.printStackTrace(pw); String ss = sw.toString(); String[] splitted = ss.split(" "); sb.append(" "); if(splitted.length > 2 + i) { for(int x = 2; x < i+2; x++) { sb.append(splitted[x].trim()); sb.append(" "); } return sb.toString(); } return"Trace too Short."; } |
前两行是异常名称和调用
感谢您访问@brianagenew(stackoverflow.com/a/1149712/1532705)了解StringWriter打印作者的想法。
如果只想截断堆栈跟踪,可以将整个堆栈跟踪打印到StringWriter,然后删除不需要的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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(" "); StringBuilder sb = new StringBuilder(); for (int i = 0; i < Math.min(lines.length, maxLines); i++) { sb.append(lines[i]).append(" "); } return sb.toString(); } |
号
或者,使用
一些日志框架可以配置为自动截断堆栈跟踪。例如,请参阅关于log4j配置的这个问题和答案。
如果您只想在代码的任何点上查看堆栈跟踪,可以从
1 |
瓜娃能帮上忙。例如,我们只想看到前十行:
1 2 | log.error("Error:", Joiner.on(" ").join(Iterables.limit(asList(ex.getStackTrace()), 10))); |
。
对于e.printstacktrace()的缩写版本:
1 2 3 4 5 6 |
。
用您想要的限制替换
最内部的方法调用位于索引0处,主方法调用位于索引长度-1处。