Подтвердить что ты не робот

Как распечатать полный стек в java

Вопрос прост, я хочу прочитать полную стекю исключения, которое я захватил:)

Пример:

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

(я хочу прочитать "... еще 23" )

С уважением:)

4b9b3361

Ответ 1

Ответ прост, эти строки уже находятся в стеке:)

 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)

В основном, в BasicDataSource#createDataSource() происходит следующее:

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

Ответ 2

BalusC является правильным. См. Здесь: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Throwable.html#printStackTrace()

В частности:

Обратите внимание на наличие строк, содержащих персонажи "...". Эти линии указывают, что оставшаяся часть трассировка стека для этого исключения указанное количество кадров из нижней части трассировки стека исключение, вызванное этим исключение (исключение "закрытие" ). Это сокращение может значительно уменьшить длина выхода в общем случай, когда обернутое исключение выбрасывается из того же метода, что и "причинное исключение" поймано.

В этом примере это означает, что:

BasicDataSource.java строка 1136 поймала ClassNotFoundException, сброшенную по строке 1130, и сделала ререйз ее как SQLNestedException. Следовательно, оставшаяся часть stacktrace для ClassNotFoundException совпадает с вышеперечисленным SQLNestedException, и stacktrace печатается в этом более сжатом формате.

Ответ 3

Когда внешнее исключение (SQLNestedException) обертывает внутреннее исключение (ClassNotFoundError), они находятся в одном потоке и поэтому совместно используют общую базу для их трассировки стека.

В (23 больше...) показано, где этот общий стек запускается для внутреннего исключения, что также является местом, где было выбрано внешнее исключение. Итак, всякий раз, когда вы видите (еще XX...), просто посмотрите на приведенное выше исключение, чтобы увидеть остальную трассировку стека.

Если вы хотите программно распечатать stacktrace без эллипсиса для общих трасс, вы можете использовать Throwable.getStackTrace() и распечатать все элементы сами.

Ответ 4

Попробуйте это. Эта логика проходит через основное исключение и все причины этого, пока не будет больше причин (cause == null), оставшихся для обработки. Таким образом, вы можете избежать сообщения еще 23. Я еще не тестировал это, но я считаю, что это должно сработать для вас.

BTW - logWriter - буферизованный писатель. Вы можете использовать System.out.print или любой другой API протоколирования.

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