Нет более элегантного способа выборочной «ловли» вложенных исключений. Я полагаю, что если бы вы делали такого рода вложенные исключения, которые вылавливали много, вы могли бы реорганизовать код в общий служебный метод. Но он все равно не будет ни элегантным, ни эффективным.
Элегантное решение - избавиться от вложенности исключений. Либо не объединяйте исключения в первую очередь, либо (выборочно) разверните и перебросьте вложенные исключения дальше по стеку.
Исключения обычно бывают вложенными по 3 причинам:
Вы решили, что детали исходного исключения вряд ли будут полезны для восстановления после ошибок приложения ... но вы хотите сохранить их для диагностических целей.
Вы реализуете методы API, которые не допускают определенного проверенного исключения, но ваш код неизбежно вызывает это исключение. Обычный обходной путь - «провозить» проверенное исключение внутри непроверенного исключения.
Вы ленитесь и превращаете разнообразный набор несвязанных исключений в одно исключение, чтобы избежать множества проверенных исключений в сигнатуре вашего метода 1 .
В первом случае, если вам теперь нужно различать обернутые исключения, тогда ваши первоначальные предположения были неверными. Лучшее решение - изменить сигнатуры методов, чтобы вы могли избавиться от вложенности.
Во втором случае вам, вероятно, следует развернуть исключения, как только элемент управления пройдет проблемный метод API.
В третьем случае вам следует пересмотреть свою стратегию обработки исключений; т.е. сделать это правильно 2 .
1 - Действительно, одна из полулегитимных причин для этого ушла из-за введения синтаксиса перехвата нескольких исключений в Java 7.
2 - Не меняйте методы API на throws Exception
. Это только усугубляет ситуацию. Теперь вам нужно либо «обрабатывать», либо распространять Exception
каждый раз, когда вы вызываете методы. Это рак ...