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
Use com.google.gwt.logging.impl.StackTracePrintStream
Throwable t = ...;
StringBuilder message = new StringBuilder();
StackTracePrintStream ps = new StackTracePrintStream(message);
t.printStackTrace(ps);
ps.flush();
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
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;
}
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";
}