سؤال

والكثير من الأوقات في سجلات جافا سأحضر شيئا مثل:

Caused by: java.sql.BatchUpdateException: failed batch
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 113 more

لا أحد يعرف كيفية الحصول على تتبع مكدس الذاكرة المؤقتة الكامل تظهر (أي عرض 113 خطوط أخرى)؟


JavaDocs (ل جافا 7) للحصول على قابل للظهور ديك شرح مفصل جدا من ما يجري.

هل كانت مفيدة؟

المحلول

وعندما ترى '... 113 أكثر "، وهذا يعني أن خطوط المتبقية من" الناجمة عن "استثناء متطابقة إلى خطوط ما تبقى من تلك النقطة على الاستثناء الأم.

وعلى سبيل المثال، سيكون لديك

com.something.XyzException
  at ...
  at ...
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
  at ... <the other 113 lines are here>...
Caused by: <the above>.

و'الوفاء' إن آثار كومة اثنين على AbstractBatcher.executeBatch، خط 242، ثم من بعد ذلك على أثر دعوة التصاعدي هو نفس ما عدا التفاف.

نصائح أخرى

العموم لانج يوفر طريقة UTIL لطيفة <لأ href = "HTTP: // العموم. apache.org/proper/commons-lang/javadocs/api-3.3/org/apache/commons/lang3/exception/ExceptionUtils.html#printRootCauseStackTrace(java.lang.Throwable) "يختلط =" noreferrer "> ExceptionUtils.printRootCauseStackTrace () الذي يطبع على تتبع مكدس الذاكرة المؤقتة متداخلة "رأسا على عقب". والنتيجة هي أكثر سهولة بكثير.

إذا كنت ترى النتيجة التالية إلى النص الأصلي من طريقة printStackTrace ()، وسوف يكون واضحا أين ذهبت "113 أكثر 'الخطوط.

وأنا أحب سبيل المثال وجدت <لأ href = "http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#printStackTrace٪28٪29" يختلط = "noreferrer" > هنا :

HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more

وأساسا في شفرة المصدر، main يدعو function a التي تدعو function b الذي يدعو ... الذي يدعو function e. Function e يلقي LowLevelException الذي يسبب وظيفة ج للقبض على LowLevelException ورمي MidLevelException (التفاف المثال LowLevelException داخل مثيل MidLevelException. الطبقة Exception لديها منشئ غير قادرة على اتخاذ في استثناء مختلفة، التفاف عليه). هذا يسبب دالة للقبض على MidLevelException ورمي HighLevelException الذي يلتف الآن حالتين Exception السابقة.

وكما لوحظ في إجابات أخرى، لا يتم اقتطاع تتبع المكدس حقا، كنت ترى تتبع المكدس الكامل. و.. .3 more في بلدي على سبيل المثال هناك لأنه سيتم زائدة على خلاف ذلك. إذا كنت تريد أن تكون خطوط الانتاج الزائدة والنفايات، يمكن أن تكون بديلا .. 3 more مع

at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
at Junk.main(Junk.java:4)

ولكن ليست هناك حاجة لإخراج هذه الخطوط الثلاثة، لأنها تنطوي بالفعل.

وخيار زيادة -XX:MaxJavaStackTraceDepth JVM.

ولقد وجدت هذا مفيدا للحصول على الصورة الكاملة. الحصول على تتبع مكدس الكامل للاستثناء و كما سبب (والتي غالبا ما تظهر خطوط المتكررة من الاستثناء الرئيسي، ولكن يمكن أن تكون مفيدة).

        ... catch( Exception e) ...

        ... catch( NoClassDefFoundError e)
        {

                for(StackTraceElement ste: e.getStackTrace())
                {
                    System.out.println(ste);
                }

                if( e.getCause()!=null )
                {
                    for(StackTraceElement ste: e.getCause().getStackTrace())
                    {
                        System.out.println(ste);
                    }
                }
        }

في بلوق وظيفة أنا فقط وصفه <لأ href = "http://inoio.de/blog/2012/11/16/how-to-get-rid-of-hibernate-genericjdbcexception/" يختلط = "نوفولو "> كيفية الحصول على أكثر من مجرد" BatchUpdateException: فشل دفعة ": مجموعة hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory لتعطيل الخلط في السبات. عادة يمكن للمرء أن استخدام BatchUpdateException.getNextException للحصول على سبب الفشل، ولكن في بعض الحالات قد ترجع null. ثم انها مفيدة لتعطيل الخلط تماما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top