Почему методы OSGI BundleActivator объявляются с "исключением бросков"?


Как start, так и stop методы OSGI BundleActivator объявляются с помощью throws Exception. В то же время в своей книге Effective Java, второе издание, пункт 62, Джошуа блох говорит

Никогда не объявляйте метод "выбрасывает исключение"

Так является ли это плохим проектным решением в BundleActivator или такая общность оправдана в данном случае и почему?
3 2

3 ответа:

Обратите внимание, что вы можете объявить свои методы start и stop без какого-либо предложения throws. (Или вы можете объявить эти методы с любыми подклассами java.lang.Exception.)

С другой стороны, конкретный, например

void start(BundleContext context) throws BundleActivatorException

Метод не слишком изменится. Это просто заставило бы разработчиков перехватывать свои исключения и перестраивать их, завернутые в BundleActivatorException. Поскольку каждое исключение делает активацию пакета бессмысленной, этот блок try-catch действительно не нужен, поэтому его проще бросить java.lang.Exception.

Выбрасывание исключения из метода start() или stop() указывает на то, что что-то серьезно не так, и изменение жизненного цикла пакета не должно проходить. Поскольку мы разделяем проблемы обнаружения ситуации (по связке) и обработки ее (по структуре), бросание Exception является единственным разумным действием.

Я считаю совет Джоша Блоха анахронизмом. Нет ничего плохого в throws Exception. Это дает вам возможность бросить любое исключение, которое вам нравится, и OSGi framework будет обрабатывать его.

Обратите внимание, что вам никогда не нужно вызывать эти методы самостоятельно.