当前位置: 首页 > 面试题库 >

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

彭弘方
2023-03-14
问题内容

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

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

编辑

我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。


问题答案:

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

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();
    }
}


 类似资料:
  • 我得到了堆栈跟踪。我所能跟踪的最远的回调是中的调用。没有留下是从调用的信息。 有没有一种方法可以获得完整的堆栈跟踪?

  • 问题内容: 有什么方法可以将堆栈跟踪作为字符串获取? 查看调试包(https://golang.org/pkg/runtime/debug/),它只能打印到标准输出。 问题答案: 将格式化的堆栈跟踪放到提供的中。然后,您可以将其转换为字符串。 您还可以使用,分配足够大的缓冲区来容纳整个堆栈跟踪,并使用将该跟踪放入其中,并返回缓冲区()。

  • 问题内容: 我看过很多关于Python中堆栈跟踪和异常的文章。但是还没有找到我所需要的。 我有一段Python 2.7代码可能会引发异常。我想捕获它并将其完整描述和导致错误的堆栈跟踪分配给 字符串 (仅仅是我们在控制台上看到的所有内容)。我需要此字符串才能将其打印到GUI中的文本框中。 像这样: 问题是: 函数 是 什么? 问题答案: 请参阅模块,特别是功能。在这里。

  • 我有两项服务-和<代码>服务1通过SpringREST模板调用一些API。现在

  • 在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。