Нет, это невозможно. Вам придется обрабатывать это самостоятельно с помощью кода, по одному уровню за раз (исключение будет делать то же самое, оно просто немного автоматизировано).
Однако, в любом случае, это не очень хорошая идея. Предположим, что вам внезапно нужно позвонить baz.bar()
из quux
, не касаясь foo
. Что теперь должно произойти, если bar
пытается вернуться к foo
, которого нет в стеке вызовов? Если вы просто хотите, чтобы он поднялся на N уровней, можете ли вы представить себе проблемы, которые могут возникнуть, если вы объедините foofoofoo
в foofoo
или измените его на добавление foofoofoofoo
, не забывая изменить bar
?
Исключение звучит в точности как правильный инструмент для этой работы: baz.bar()
не должно заботиться о том, что оно должно перейти к foo
, оно должно знать что-то исключительное произошло, требующее его прервать что он делает, и тогда foo
должен знать, что эта исключительная ситуация может возникнуть, и справиться с ней (даже если в этом случае он просто ничего не делает). Чтобы избежать необходимости добавлять предложение throws ко всему, используйте вместо этого исключение без проверки.