Turn a stack trace into a string?

后端 未结 4 770
日久生厌
日久生厌 2021-01-08 00:23

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

相关标签:
4条回答
  • 2021-01-08 00:32

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

    Throwable t = ...;
    StringBuilder message = new StringBuilder();
    StackTracePrintStream ps = new StackTracePrintStream(message);
    t.printStackTrace(ps);
    ps.flush();
    
    0 讨论(0)
  • 2021-01-08 00:35

    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

    0 讨论(0)
  • 2021-01-08 00:42

    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;
    }
    
    0 讨论(0)
  • 2021-01-08 00:54

    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";
    }
    
    0 讨论(0)
提交回复
热议问题