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