2012-12-01 1 views
13

Ist es möglich, eine Stack-Trace auf eine Zeichenfolge in GWT zu drucken? Die üblichen Verfahren zur Herstellung der Klassen in java.io verwenden werde ich nicht arbeiten denken, weil das java.io Paket nicht verfügbar ist client (und Writer, Printwriter, etc. in diesem Paket sind)Eine Stapelspur in eine Zeichenkette umwandeln?

Danke

+1

Es wäre die Frage besser, wenn Sie erwähnen können, welche Version von GWT Sie verwenden und welche Protokollierungstechnik Sie auf Client-Seite folgen. – SSR

+1

Über welche Stack-Trace sprichst du? Kompilierzeit oder Laufzeit? Wenn es Laufzeit ist, verwenden Sie einfach einen Logger, oder umgeben Sie Ihren Code mit try catch block und übertragen Sie den Exception-Stack-Trace auf die gewünschte Zeichenfolge –

+0

Hallo, Laufzeit Ausnahme - ich verwende GWT 2.5. Ja, die Sache ist, ich möchte eine vollständige Stack-Trace in eine Zeichenfolge konvertieren und dann vielleicht in einem Label anzeigen. Aber wie können wir einen Ausnahme-Stack-Trace als String erhalten? – user291701

Antwort

10

ich bin mir nicht sicher, ob StackTraceElement emuliert wird, aber wenn es ist, können Sie so etwas wie

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

Hier ist die Methode, die ich bin mit zurückzuholen einem vollständigen Stack-Trace als String in GWT laufen:

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

Das funktioniert super. Aber wie benutzt du StackTraceDeobfuscator? – confile

3

Ich würde nicht empfehlen, Fehler-Stack-Trace in einem GUI-Label anzuzeigen.

1) Sie sind nach GWT-Verschleierung nicht lesbar. Sie sehen einfach aus wie ein Bündel von Tab-ausgerichteten Zeichen über neuen Zeilen.

2) Sie sind nicht im I18N-Format.

3) Der richtige Weg ist der gerade gezeigte Benutzer ein wohlgeformter Fehler "Nachricht". exception.getMessage() gibt Ihnen eine einzige Zeile mit Nicht-Obf-Informationen, die dem Benutzer die erforderliche UX-Interaktion bereitstellen soll.

4) Wenn Sie für well formed Ausnahme Stacktrace nützlich für das Debuggen (nicht für Benutzer suchen) Sie GWT gut dokumentiert Protokollierungsfunktion mit Web-Modus Ausnahmen verwenden sollten -

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

b) Lesen Sie auch auf http://code.google.com/p/google-web-toolkit/wiki/WebModeExceptions