堆栈跟踪作为字符串

Posted

技术标签:

【中文标题】堆栈跟踪作为字符串【英文标题】:Stack trace as String 【发布时间】:2013-09-04 00:08:22 【问题描述】:

如何在 Java 中获得完整的异常消息?

我正在创建一个 Java 应用程序。如果出现运行时异常,将弹出带有JTextAreaJDialog。我试图在我的应用程序中创建运行时异常,但显示异常消息的文本区域如下所示:

java.lang.ClassNotFoundException: com.app.Application

但是,我希望我的文本区域显示如下内容:

这是我的代码的一部分,被trycatch 包围:

String ex = e.toString();
this.addText(ex);

我尝试过使用e.getLocalizedMessage()e.getMessage(),但这些都不起作用。

【问题讨论】:

检查我提供的更新答案。您可以将跟踪转换为字符串格式供您显示。 使用ExceptionObject.printStackTrace(); 只是堆栈跟踪到字符串部分:***.com/questions/1149703/… 【参考方案1】:

您需要拨打Throwable#printStackTrace(PrintWriter);

try

catch(Exception ex)
    String message = getStackTrace(ex);


public static String getStackTrace(final Throwable throwable) 
     final StringWriter sw = new StringWriter();
     final PrintWriter pw = new PrintWriter(sw, true);
     throwable.printStackTrace(pw);
     return sw.getBuffer().toString();

您还可以使用提供此功能的 commons-lang-2.2.jar Apache Commons Lang 库:

public static String getStackTrace(Throwable throwable)
Gets the stack trace from a Throwable as a String.

ExceptionUtils#getStackTrace()

【讨论】:

太棒了!帮助我解决了 android 中的 InputStream 错误 :)【参考方案2】:

试试e.printStackTrace(),它会为您的异​​常打印跟踪,并带有提到的行

【讨论】:

【参考方案3】:

这是完整的异常消息。

如果您想了解更多信息,请尝试 e.printStackTrace()

然后你会得到你在发布的图片上看到的东西

【讨论】:

【参考方案4】:

如果您没有使用任何记录器(Log4j 或 oracle 记录器 API),那么您可以使用以下语句打印完整的异常消息

try
       // statement which you want to monitor 

catch(Exception e)
    e.printStackTrace()
    // OR System.err.println(e.getStackTrace());
    // OR System.err.println(e);
    // OR System.err.println(e.getMessage());
    // OR System.err.println(e.getCause());

如果您使用的是 Logger API,请使用以下语句

try

         // statement which you want to monitor 

catch(Exception e)
  log.error(e,e); 

【讨论】:

【参考方案5】:

e.printStackTrace 将给出完整的堆栈跟踪

【讨论】:

【参考方案6】:

要将堆栈跟踪转换为字符串,您可以使用以下行:

    CharArrayWriter cw = new CharArrayWriter();
    PrintWriter w = new PrintWriter(cw);
    e.printStackTrace(w);
    w.close();
    String trace = cw.toString();

【讨论】:

【参考方案7】:
public static String getStackMsg(Throwable e) 
    StringBuffer sb = new StringBuffer();
    sb.append(e.toString()).append("\n");
    StackTraceElement[] stackArray = e.getStackTrace();

    for(int i = 0; i < stackArray.length; ++i) 
        StackTraceElement element = stackArray[i];
        sb.append(element.toString() + "\n");
    

    return sb.toString();

【讨论】:

以上是关于堆栈跟踪作为字符串的主要内容,如果未能解决你的问题,请参考以下文章

防止 Mongoose 堆栈跟踪错误

有没有办法在黑莓中以字符串的形式获取异常的堆栈跟踪?

将堆栈跟踪打印到字符串

了解堆栈跟踪 [重复]

我的程序崩溃时如何自动生成堆栈跟踪

Android WebView:有没有办法获取 javascript 堆栈跟踪?