Использование Throwable для вещей, отличных от исключений

Я всегда видел Throwable / Exception в контексте ошибок. Но я могу вспомнить ситуации, когда было бы действительно неплохо расширить Throwable только для того, чтобы выйти из стека вызовов рекурсивных методов. Скажем, например, вы пытались найти и вернуть какой-то объект в дереве с помощью рекурсивного поиска. Как только вы найдете его, вставьте его в какой-нибудь Carrier extends Throwable , выбросьте его и поймайте в методе, вызывающем рекурсивный метод.

Положительно: вам не нужно беспокоиться о логике возврата рекурсивных вызовов; раз уж вы нашли то, что вам нужно, зачем беспокоиться о том, как вы перенесете эту ссылку обратно в стек методов.

Отрицательный: у вас есть трассировка стека, которая вам не нужна. Также блок try / catch становится нелогичным.

Вот идиотически простое использование:

public class ThrowableDriver {
    public static void main(String[] args) {
        ThrowableTester tt = new ThrowableTester();
        try {
            tt.rec();
        } catch (TestThrowable e) {
            System.out.print("All good\n");
        }
    }
}

public class TestThrowable extends Throwable {

}

public class ThrowableTester {
    int i=0;

    void rec() throws TestThrowable {
        if(i == 10) throw new TestThrowable();
        i++;
        rec();
    }
}

Вопрос в том, есть ли лучший способ добиться того же? Кроме того, есть ли что-то изначально плохое в том, чтобы делать что-то таким образом?

6
задан Jeremy Roman 1 August 2011 в 03:24
поделиться