user291701
user291701

Reputation: 39681

Turn a stack trace into a string?

Is it possible to print a stack trace to a string in GWT? The usual methods of using the classes in java.io won't work I think, because the java.io package is not available clientside (and Writer, PrintWriter, etc are in that package)

Thank you

Upvotes: 16

Views: 6240

Answers (4)

sidon
sidon

Reputation: 1482

Use com.google.gwt.logging.impl.StackTracePrintStream

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

Upvotes: 3

appbootup
appbootup

Reputation: 9537

I would not recommend trying to display error stack trace in a GUI label.

1) They are not readable after GWT Obfuscation. They just look like bunch of tab aligned characters over new lines.

2) They are not in I18N format.

3) The correct way is the just show user a well formed error "Message" . exception.getMessage() will give you a single line of non-obf information which should provide the necessary UX interaction to user.

4) If you are looking for well formed exception stacktrace helpful for debugging ( not for user ) you should use GWT's well documented logging feature with web mode exceptions -

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

b) Also read on http://code.google.com/p/google-web-toolkit/wiki/WebModeExceptions

Upvotes: 3

Florent Bayle
Florent Bayle

Reputation: 11920

Here is the method I'm using to retrieve a full stack trace as a String in GWT :

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

Upvotes: 9

Riley Lark
Riley Lark

Reputation: 20890

I'm not sure if StackTraceElement is emulated, but if it is you can run something like

for (StackTraceElement element : exception.getStackTrace()) {
    string += element + "\n";
}

Upvotes: 15

Related Questions