Java 获取包含内部异常的完整字符串堆栈跟踪

Java 获取包含内部异常的完整字符串堆栈跟踪,java,stack-trace,Java,Stack Trace,Java的e.printStackTrace()不会打印内部异常堆栈跟踪的所有详细信息 是否有现成的方法以字符串形式生成完整的堆栈跟踪?(除了自己格式化) 编辑 我刚刚了解了printStackTrace()的作用-显然,它过滤出的堆栈帧与内部异常和外部异常的相同。因此,事实上这正是我想要的,而不是“完整”堆栈跟踪。我建议您使用Apache Commons lang中的类,该类提供了有用的方法。是的,您可以使用Throwable.getStackTrace()返回的StackTraceeElem

Java的e.printStackTrace()不会打印内部异常堆栈跟踪的所有详细信息

是否有现成的方法以字符串形式生成完整的堆栈跟踪?(除了自己格式化)

编辑


我刚刚了解了printStackTrace()的作用-显然,它过滤出的堆栈帧与内部异常和外部异常的相同。因此,事实上这正是我想要的,而不是“完整”堆栈跟踪。

我建议您使用Apache Commons lang中的类,该类提供了有用的方法。

是的,您可以使用Throwable.getStackTrace()返回的StackTraceeElement类并查找详细信息

从API:

数组的最后一个元素(假设数组的长度为 非零)表示堆栈的底部,这是第一种方法 顺序中的调用

我最终实现了自己的(我采用了Throwable.printStackTrace()的实现,并对其进行了一些调整):

公共静态字符串joinStackTrace(可丢弃的e){
StringWriter=null;
试一试{
writer=新的StringWriter();
joinStackTrace(e,作者);
返回writer.toString();
}
最后{
if(writer!=null)
试一试{
writer.close();
}捕获(IOE1异常){
//忽略
}
}
}
公共静态无效JointStackTrace(可丢弃的e、StringWriter){
PrintWriter打印机=空;
试一试{
打印机=新的打印写入程序(写入程序);
while(e!=null){
println(e);
StackTraceElement[]trace=e.getStackTrace();
对于(int i=0;i
这是什么意思-内部异常的堆栈跟踪?捕获的异常是否正在另一个异常中传播?捕获所产生的某些东西。。。抛出新异常(“foo”,e)我刚刚发现printStackTrace()的作用-显然,它过滤出的堆栈帧正是内部异常和外部异常的共同点。因此,事实上这正是我想要的,而不是“完整”堆栈跟踪。实际上,getFullStacktrace()仍然不打印内部堆栈跟踪。不幸的是,没有printFullStacktrace()方法,但您可以执行System.err.println(getFullStacktrace());您是否错过了打印内部异常的堆栈跟踪<代码>如果(e!=null)printer.println(“由以下原因引起:\r\n”)类似于
printer.println(“由:\r\n”+joinStackTrace(e)引起的”)
public static String joinStackTrace(Throwable e) {
    StringWriter writer = null;
    try {
        writer = new StringWriter();
        joinStackTrace(e, writer);
        return writer.toString();
    }
    finally {
        if (writer != null)
            try {
                writer.close();
            } catch (IOException e1) {
                // ignore
            }
    }
}

public static void joinStackTrace(Throwable e, StringWriter writer) {
    PrintWriter printer = null;
    try {
        printer = new PrintWriter(writer);

        while (e != null) {

            printer.println(e);
            StackTraceElement[] trace = e.getStackTrace();
            for (int i = 0; i < trace.length; i++)
                printer.println("\tat " + trace[i]);

            e = e.getCause();
            if (e != null)
                printer.println("Caused by:\r\n");
        }
    }
    finally {
        if (printer != null)
            printer.close();
    }
}