我们有一个系统,可以使用Groovy脚本进行定制。我注意到从这些脚本中抛出的异常类型非常奇怪。
我们有一个包含以下内容的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。这段代码是有效的,编译运行都很顺利。正如我想要的那样,它抛出了异常。
有没有人知道这是合法的代码?理论上,我不应该能够从不声明它会抛出异常的方法中抛出已检查的异常。