У нас есть система, которую можно настроить с помощью groovy-скриптов, и я обнаружил очень странное влияние на тип исключений, которые выбрасываются из этих сценариев.Java с Groovy обработка бросков затвора Исключения
У нас есть заводной скрипт со следующим:
process {
throw new Exception("weeee")
}
Процесс определяется как замыкание в базовом классе сценария:
public abstract class ScriptBaseClass extends Script {
Closure process;
public void process(Closure code) {
process = (Closure) code.clone();
}
}
В Java класс что на самом деле работает в сценариях мы имеем следующий метод (опущен весь установленный код, поскольку он не кажется релевантным):
public void process() {
try {
script.process.call();
} catch (Exception e) {
logger.debug("exception thrown from groovy script", e);
throw e;
}
}
Обратите внимание, что метод процесса здесь не объявляет, что он выбрасывает исключения. Однако он довольно четко перебрасывает Исключение e, которое он поймал. Этот код действителен, он компилируется и работает довольно счастливо. Он бросает Исключение, как я хотел.
Кто-нибудь знает, как это законный код? Теоретически я не могу выкинуть проверенное исключение из метода, который не объявляет, что он его выбрасывает.
да, это законно в заводной. не может найти упоминания в docs btw, но он всегда работал –
@IgorArtamonov Действительно, я знаю, что это законно в groovy, однако метод процесса, выше которого перебрасывает исключение, находится в классе Java. Обычно, если вы выбрали исключенное исключение, вы должны его объявить.Это кажется странным случаем вокруг интерфейса двух языков. –
О, извините, первая часть о groovy была запутанной, поэтому я пропустил часть о java –