2010-06-03 9 views
37

Die Frage ist einfach, ich will die volle Stacktrace einer Ausnahme lesen, die ich :)wie die vollständige Stacktrace in Java drucken

Beispiel erfassen:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver' 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1136) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 
at com.azurian.lce.usuarios.ConnectionManager.getConnection(ConnectionManager.java:65) 
at com.azurian.lce.usuarios.db2.UsuarioDAOImpl.autenticar(UsuarioDAOImpl.java:101) 
at com.azurian.lce.usuarios.UsuarioServiceImpl.autenticar(UsuarioServiceImpl.java:31) 
at com.azurian.lce.web.admin.actions.LoginAction.execute(LoginAction.java:49) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: COM.ibm.db2.jcc.DB2Driver 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1130) 
... 23 more 

(i die lesen wollen "... 23 mehr")

Grüße :)

+2

Gahhhh ... so viele Runs und Prozesse und ruft und führt und dos ... http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns. html – naiad

+1

siehe: http://stackoverflow.com/questions/1167888/howto-increase-lines-of-java-stack-trace-dump und http://stackoverflow.com/questions/1043378/print-full-call -stack-on-printstacktrace und http://stackoverflow.com/questions/437756/how-do-i-stop-stacktraces-truncing-in-logs um nur ein paar zu nennen – akf

+0

Hallo! Schau dir http://people.inf.elte.hu/balopat/bug.html an Ich habe dich generiert, schwebe über den Kreisen, ich hoffe es wird dir helfen zu verstehen, was "... 23 mehr" bedeutet :) Grundsätzlich sind die Antworten richtig, das ist nur eine Illustration. –

Antwort

29

die Antwort ist einfach, sind diese Linien bereits im Stacktrace :)

at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 
at com.azurian.lce.usuarios.ConnectionManager.getConnection(ConnectionManager.java:65) 
at com.azurian.lce.usuarios.db2.UsuarioDAOImpl.autenticar(UsuarioDAOImpl.java:101) 
at com.azurian.lce.usuarios.UsuarioServiceImpl.autenticar(UsuarioServiceImpl.java:31) 
at com.azurian.lce.web.admin.actions.LoginAction.execute(LoginAction.java:49) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

Grundsätzlich ist folgendes passiert in BasicDataSource#createDataSource():

try { 
    Class.forName(driverClassName); // Line 1130 
} catch (ClassNotFoundException e) { 
    throw new SQLNestedException(e, "Cannot load JDBC driver class '" + driverClassName + "'"); // Line 1136 
} 
+1

warum? [....] – OscarRyz

+0

Nun, wenn eine lange Zeit vergangen ist, habe ich gelesen, dass die Antworten sehr einfach waren, es war ein Glas-Hölle-Problem (oder in diesem Fall fehlt das Jar mit dem DB2-Treiber. "Verursacht durch: java.lang.ClassNotFoundException: COM.ibm.db2.jcc.DB2Driver" –

+1

Dies beantwortet die Frage nicht, ja, diese Zeilen befinden sich bereits im Stack-Trace, aber sie werden nicht gedruckt! Wie man sie ausdruckt, war die Frage, die Sie überhaupt nicht beantwortet haben! – plainOldNerd

24

BalusC richtig ist. Siehe hier: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Throwable.html#printStackTrace()

Insbesondere:

Hinweis das Vorhandensein von Zeilen mit die Zeichen "...". Diese Linien anzuzeigen, dass der Rest der Stapelüberwachung für diese Ausnahme übereinstimmt die angezeigte Anzahl des Rahmen, die von der Boden der Stapelüberwachung der Ausnahme, die durch diese Ausnahme (das „einschließenden“ exception) verursacht wurde. Diese Kurzschrift kann die Länge der Ausgabe im gemeinsamen Fall stark reduzieren, in dem eine eingewickelte Ausnahme von der gleichen Methode wie die "verursachende Ausnahme" ausgelöst wird, geworfen wird.

Was dies in Ihrem Beispiel bedeutet, dass:

BasicDataSource.java Linie 1136 die ClassNotFoundException auf Linie 1130 geworfen gefangen und reraiste ihn als SQLNestedException. Daher entspricht der Rest des Stacktrace für die ClassNotFoundException der obigen SQLNestedException und der Stacktrace wird in diesem übersichtlicheren Format gedruckt.

7

Wenn die äußere Ausnahme (SQLNestedException) die innere Ausnahme (ClassNotFoundError) umschließt, befindet sie sich im selben Thread und teilt somit eine gemeinsame Basis für ihre Stack-Ablaufverfolgung.

Die (23 mehr ...) zeigt, wo dieser gemeinsame Stapel für die innere Ausnahme beginnt, wo auch die äußere Ausnahme ausgelöst wurde. Wenn Sie also (XX mehr ...) sehen, sehen Sie sich die Ausnahme oben an, um den Rest des Stack-Trace zu sehen.

Wenn Sie den StackTrace ohne die Auslassungszeichen für allgemeine Traces programmgesteuert ausdrucken möchten, können Sie Throwable.getStackTrace() verwenden und alle Elemente selbst ausdrucken.

+0

danke an alle für die Antworten :) es hilft mir sehr (zu verstehen, was passiert mit dem Programm, das ich tue) grüßt –

4

Probieren Sie es aus. Diese Logik durchläuft die Hauptausnahme und alle Ursachen dafür, bis keine weitere Ursache (cause == null) mehr zu verarbeiten ist. Auf diese Weise können Sie die 23 mehr ... Nachricht vermeiden. Ich habe das noch nicht getestet, aber ich glaube, das sollte für Sie funktionieren.

BTW - logWriter ist ein gepufferter Schreiber. Möglicherweise möchten Sie System.out.print oder eine andere Protokollierungs-API verwenden.

public static void debugError(final String message, final Throwable th) { 
    final String logMessage = "[ERROR] - " + message; 

    try { 
     logWriter.write(logMessage); 
     logWriter.newLine(); 

     // dump exception stack if specified 
     if (null != th) { 
      final StackTraceElement[] traces = th.getStackTrace(); 
      if (null != traces && traces.length > 0) { 
       logWriter.write(th.getClass() + ": " + th.getMessage()); 
       logWriter.newLine(); 

       for (final StackTraceElement trace : traces) { 
        logWriter.write(" at " + trace.getClassName() + '.' + trace.getMethodName() + '(' + trace.getFileName() + ':' + trace.getLineNumber() + ')'); 
        logWriter.newLine(); 
       } 
      } 

      Throwable cause = th.getCause(); 
      while (null != cause) { 
       final StackTraceElement[] causeTraces = cause.getStackTrace(); 
       if (null != causeTraces && causeTraces.length > 0) { 
        logWriter.write("Caused By:"); 
        logWriter.newLine(); 
        logWriter.write(cause.getClass() + ": " + cause.getMessage()); 
        logWriter.newLine(); 

        for (final StackTraceElement causeTrace : causeTraces) { 
         logWriter.write(" at " + causeTrace.getClassName() + '.' + causeTrace.getMethodName() + '(' + causeTrace.getFileName() + ':' + causeTrace.getLineNumber() + ')'); 
         logWriter.newLine(); 
        } 
       } 

       // fetch next cause 
       cause = cause.getCause(); 
      } 
     } 
    } catch (final IOException ex) { 
     System.err.println(logMessage); 

     if (null != th) { 
      th.printStackTrace(); 
     } 
    } 
} 
+0

Sie könnten einen 'Reader' verwenden, um die 'printStackTrace'-Ausgabe zu lesen, bis sie _Cause_erfüllt, dann die Ursache abruft und deren Stack-Trace ausgibt (Suche nach dem nächsten _Caused by _) ... und rekursiv diesen Vorgang wiederholen bis dort a Es gibt keine Stapelspuren mehr. Auf diese Weise müssen Sie nicht Ihren eigenen Stacktrace-Formatierer erstellen - Sie können verwenden, was bereits verfügbar ist:) ' – ADTC

+0

Ihr Code funktioniert gut. Um den Trace an system.out zu senden, füge ich einfach 'BufferedWriter logWriter = new BufferedWriter (neuer OutputStreamWriter (System.out));' und am Ende: 'logWriter.flush();' – Ben

Verwandte Themen