堆栈转为String以及运行时获取调用栈"/>
异常堆栈转为String以及运行时获取调用栈
纯Java实现
public class ExceptionUtils {public static String getStackTrace(Exception e) {StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);e.printStackTrace(pw);pw.close();try {sw.close();} catch (IOException e1) {//ignore}return sw.toString();}
}
依赖commons-lang3实现
String stacktrace = ExceptionUtils.getStacktrace(e);
通过异常打印出当前调用栈
ExceptionUtils.getStacktrace(new Throwable());
Java 9的StackWalker
Java 9中提供了StackWalker灵活的获取调用栈并做一些简单的过滤
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StackWalkerUtil {public static List<StackWalker.StackFrame> getCurrentCallStack() {return StackWalker.getInstance().walk(StackWalkerUtil::walkExample);}private static List<StackWalker.StackFrame> walkExample(Stream<StackWalker.StackFrame> stackFrameStream) {return stackFrameStream.collect(Collectors.toList());}public static void method1() {getCurrentCallStack().stream().filter(frame -> frame.getClassName().contains("StackWalkerUtil") && frame.getClassName().endsWith("Util")).forEach(stackFrame -> System.out.println(stackFrame.toString()));}public static void method2() {method1();}public static void method3() {method2();}public static void method4() {method3();}public static void main(String[] args) {method4();}
}
输出是:
StackWalkerUtil.getCurrentCallStack(StackWalkerUtil.java:9)
StackWalkerUtil.method1(StackWalkerUtil.java:17)
StackWalkerUtil.method2(StackWalkerUtil.java:22)
StackWalkerUtil.method3(StackWalkerUtil.java:26)
StackWalkerUtil.method4(StackWalkerUtil.java:30)
StackWalkerUtil.main(StackWalkerUtil.java:34)
更多推荐
异常堆栈转为String以及运行时获取调用栈
发布评论