كيف يمكنني التوقف stacktraces اقتطاع في سجلات
-
22-07-2019 - |
سؤال
والكثير من الأوقات في سجلات جافا سأحضر شيئا مثل:
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
. ثم انها مفيدة لتعطيل الخلط تماما.