将堆栈跟踪转换为字符串?

时间:2012-12-01 21:08:58

标签: gwt

是否可以在GWT中将堆栈跟踪打印到字符串?我认为在java.io中使用类的常用方法不起作用,因为java.io包在客户端不可用(而Writer,PrintWriter等在该包中)

谢谢

4 个答案:

答案 0 :(得分:12)

我不确定StackTraceElement是否被模拟,但如果是,你可以运行像

这样的东西
for (StackTraceElement element : exception.getStackTrace()) {
    string += element + "\n";
}

答案 1 :(得分:9)

这是我用来在GWT中检索完整堆栈跟踪作为String的方法:

private static String getMessage (Throwable throwable) {
    String ret="";
    while (throwable!=null) {
            if (throwable instanceof com.google.gwt.event.shared.UmbrellaException){
                    for (Throwable thr2 :((com.google.gwt.event.shared.UmbrellaException)throwable).getCauses()){
                            if (ret != "")
                                    ret += "\nCaused by: ";
                            ret += thr2.toString();
                            ret += "\n  at "+getMessage(thr2);
                    }
            } else if (throwable instanceof com.google.web.bindery.event.shared.UmbrellaException){
                    for (Throwable thr2 :((com.google.web.bindery.event.shared.UmbrellaException)throwable).getCauses()){
                            if (ret != "")
                                    ret += "\nCaused by: ";
                            ret += thr2.toString();
                            ret += "\n  at "+getMessage(thr2);
                    }
            } else {
                    if (ret != "")
                            ret += "\nCaused by: ";
                    ret += throwable.toString();
                    for (StackTraceElement sTE : throwable.getStackTrace())
                            ret += "\n  at "+sTE;
            }
            throwable = throwable.getCause();
    }

    return ret;
}

答案 2 :(得分:3)

我不建议尝试在GUI标签中显示错误堆栈跟踪。

1)GWT混淆后它们不可读。它们看起来就像新行上的一组制表符对齐的字符。

2)它们不是I18N格式。

3)正确的方法是向用户展示一个格式错误的“消息”。 exception.getMessage()将为您提供一行非obf信息,这些信息应该为用户提供必要的UX交互。

4)如果您正在寻找有助于调试的 well formed 异常堆栈跟踪(不适用于用户),您应该使用GWT记录良好的日志记录功能和Web模式异常 -

a)https://developers.google.com/web-toolkit/doc/latest/DevGuideLogging

b)另请阅读http://code.google.com/p/google-web-toolkit/wiki/WebModeExceptions

答案 3 :(得分:0)

使用com.google.gwt.logging.impl.StackTracePrintStream

Throwable t = ...;
StringBuilder message = new StringBuilder();
StackTracePrintStream ps = new StackTracePrintStream(message);
t.printStackTrace(ps);
ps.flush();