Лучший способ проверить, был ли определенный тип исключительной ситуации причиной (причины, и т.д. …) во вложенной исключительной ситуации?

Вы не можете не зафиксировать высоту StackPanel. Он предназначен для неограниченного роста в одном направлении. Я бы посоветовал использовать другой Panel. Зачем вам «нужен» внешний StackPanel?

25
задан Yang Meyer 4 March 2009 в 15:42
поделиться

5 ответов

Почему вы хотите избежать getCause. Конечно, вы можете написать себе метод для выполнения задачи, например:

public static boolean isCause(
    Class<? extends Throwable> expected,
    Throwable exc
) {
   return expected.isInstance(exc) || (
       exc != null && isCause(expected, exc.getCause())
   );
}
27
ответ дан Tom Hawtin - tackline 28 November 2019 в 06:30
поделиться

Я не думаю, что у Вас есть любой выбор, но звонить через слои getCause. Если Вы смотрите на исходный код для Spring NestedRuntimeException, который Вы упоминаете, именно так он реализован.

5
ответ дан Mark 28 November 2019 в 06:30
поделиться

Имитация является самой искренней формой лести. На основе быстрого контроля источника , это точно, что делает NestedRuntimeException:

/**
 * Check whether this exception contains an exception of the given type:
 * either it is of the given class itself or it contains a nested cause
 * of the given type.
 * @param exType the exception type to look for
 * @return whether there is a nested exception of the specified type
 */
public boolean contains(Class exType) {
    if (exType == null) {
        return false;
    }
    if (exType.isInstance(this)) {
        return true;
    }
    Throwable cause = getCause();
    if (cause == this) {
        return false;
    }
    if (cause instanceof NestedRuntimeException) {
        return ((NestedRuntimeException) cause).contains(exType);
    }
    else {
        while (cause != null) {
            if (exType.isInstance(cause)) {
                return true;
            }
            if (cause.getCause() == cause) {
                break;
            }
            cause = cause.getCause();
        }
        return false;
    }
}

ПРОТЕСТ : Вышеупомянутое является кодом с 4 марта 2009 так, если Вы действительно хотите знать то, что Spring делает прямо сейчас, необходимо исследовать код, поскольку это существует сегодня (каждый раз, когда это).

2
ответ дан Bob Cross 28 November 2019 в 06:30
поделиться

Ну, я думаю, что нет способа сделать это без звонка getCause(). Если вы думаете, что это уродливо реализует класс утилиты для этого:

public class ExceptionUtils {
     public static boolean wasCausedBy(Throwable e, Class<? extends Throwable>) {
         // call getCause() until it returns null or finds the exception
     }
}
1
ответ дан bruno conde 28 November 2019 в 06:30
поделиться

На основании ответа Патрика Бооса: Если вы используете Apache Commons Lang 3, вы можете проверить:

indexOfThrowable : Возвращает (основанный на нуле) индекс первого Throwable, соответствующего указанному классу. ( точно ) в цепочке исключений. Подклассы указанного класса не соответствуют

if (ExceptionUtils.indexOfThrowable(e, clazz) != -1) {
    // your code
}

или

indexOfType : возвращает индекс (на основе нуля) первого Throwable, который соответствует указанному классу или подклассу в цепочке исключений. Подклассы указанного класса соответствуют

if (ExceptionUtils.indexOfType(e, clazz) != -1) {
    // your code
}

Пример для нескольких типов с Java 8:

Class<? extends Throwable>[] classes = {...}
boolean match = Arrays.stream(classes)
            .anyMatch(clazz -> ExceptionUtils.indexOfType(e, clazz) != -1);
1
ответ дан Nagy Attila 28 November 2019 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: