【发布时间】:2015-11-06 05:30:47
【问题描述】:
我们有一个可以使用 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;
}
}
注意这里的 process 方法没有声明它抛出任何异常。然而,它很清楚地重新抛出了它捕获的异常 e。这段代码是有效的,它编译和运行非常愉快。它按照我的意愿抛出异常。
有谁知道这是法律法规吗?从理论上讲,我不应该能够从一个没有声明它抛出它的方法中抛出一个已检查的异常。
【问题讨论】:
-
是的,这在 groovy 中是合法的。顺便说一句,在文档中找不到任何提及,但它一直在工作
-
@IgorArtamonov 实际上我知道这在 groovy 中是合法的,但是上面重新抛出异常的 process 方法在 Java 类中。通常如果你抛出一个检查异常,你必须声明它。这似乎是两种语言界面的一个奇怪案例。
-
哦,抱歉,关于 groovy 的第一部分令人困惑,所以我错过了关于 java 的部分