Я всегда видел 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();
}
}
Вопрос в том, есть ли лучший способ добиться того же? Кроме того, есть ли что-то изначально плохое в том, чтобы делать что-то таким образом?