it-swarm.asia

كيف يمكنني تنفيذ حلقة خلال الاستثناء getCause () للعثور على السبب الجذري مع رسالة التفاصيل

أحاول الاتصال بـ saveOrUpdate() في وضع السبات لحفظ البيانات. نظرًا لأن الأعمدة لها فهرس فريد ، لذا فإن رمياتها ConstraintViolationException عندما أتصفح عبر مصحح أخطاء Eclipse.

منذ السبب الجذري يمكن أن تكون مختلفة عن استثناء مختلف أثناء إدراج البيانات إلى الجدول.
أردت أن أعرف ، كيف يمكنني إجراء حلقة/المرور عبر getCause() للتحقق من السبب الجذري للاستثناء ورسالته.

تحديث:
شكرًا للجميع على ردكم اللطيف ، والشيء هو أنني أريد الإخراج كما في الصورة أدناه:
enter image description here
أحتاج إلى الوصول إلى detailMessage الحقل.
(أنا آسف حقًا إذا لم أتمكن من جعل سؤالي أكثر وضوحًا.)

شكر.

57
agpt

يوفر Apache ExceptionUtils الطريقة التالية:

Throwable getRootCause(Throwable throwable) 

طالما

String getRootCauseMessage(Throwable th) 
78
reto

عادةً ما أستخدم التطبيق أدناه بدلاً من تطبيق Apache.

إلى جانب تعقيده ، فإن تطبيق Apache يعود باطلًا عند عدم العثور على أي سبب ، الأمر الذي يجبرني على القيام بفحص إضافي للإلغاء.

عادةً عند البحث عن جذر/سبب الاستثناء لدي بالفعل استثناء غير صفري للبدء به ، والذي هو بالنسبة لجميع المقترحات المقصودة سبب الفشل في متناول اليد ، إذا تعذر العثور على سبب أعمق.

Throwable getCause(Throwable e) {
    Throwable cause = null; 
    Throwable result = e;

    while(null != (cause = result.getCause())  && (result != cause) ) {
        result = cause;
    }
    return result;
}
55
Legna

باستخدام Java 8 Stream API ، يمكن تحقيق ذلك من خلال:

Optional<Throwable> rootCause = Stream.iterate(exception, Throwable::getCause)
                                      .filter(element -> element.getCause() == null)
                                      .findFirst();

لاحظ أن هذا الرمز ليس محصنًا من حدوث استثناءات للحلقات وبالتالي يجب تجنبه في الإنتاج.

16
SpaceTrucker

هل تسأل عن شيء مثل هذا؟

Throwable cause = originalException;
while(cause.getCause() != null && cause.getCause() != cause) {
    cause = cause.getCause();
}

أم هل فاتني شيء؟

8
morgano

يوفر Guava's Throwables الأساليب التالية:

Throwable getRootCause(Throwable throwable)

طالما

String getStackTraceAsString(Throwable throwable)
7
schnatterer
} catch (Exception ex) {
    while (ex.getCause() != null)
        ex = ex.getCause();
    System.out.println("Root cause is " + ex.getMessage());
}

هل كنت تتوقع شيئًا أكثر تعقيدًا؟

3
Ernest Friedman-Hill

جرب هذا ، يمكنك وضع هذه الوظيفة في نوع Util:

public static Throwable getRootException(Throwable exception){
 Throwable rootException=exception;
 while(rootException.getCause()!=null){
  rootException = rootException.getCause();
 }
 return rootException;
}

مثال على الاستخدام:

catch(MyException e){
  System.out.println(getRootException(e).getLocalizedMessage());
}

المصدر: كيفية الحصول على استثناء الجذر لأي استثناء

2
Mehdi

في اباتشي ؛ التنفيذ يشبه أدناه.

التمييز هو list.contains (قابل للقذف) == false

public static Throwable getRootCause(final Throwable throwable) {
    final List<Throwable> list = getThrowableList(throwable);
    return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1);
}

public static List<Throwable> getThrowableList(Throwable throwable) {
    final List<Throwable> list = new ArrayList<Throwable>();
    while (throwable != null && list.contains(throwable) == false) {
        list.add(throwable);
        throwable = ExceptionUtils.getCause(throwable);
    }
    return list;
}
2
Kanagavelu Sugumar

متكرر:

public static Throwable getRootCause(Throwable e) {
    if (e.getCause() == null) return e;
    return getRootCause(e.getCause());
}
1
Roman Khomyshynets