我想让用户提供一个groovy类,其属性是一个文件选择器闭包,我将其传递给AntBuilder的'copy'任务:
class Foo {
def ANT = { fileset(dir:'/tmp/tmp1') }
}
在我的代码中,我将ANT属性作为'fAnt'并传递给Ant:
ant.copy(todir:'/tmp/tmp2', fAnt)
这有效 - 但是,如果用户传入一个空闭包(def ANT = {})或者没有选择任何东西的选择器(可能文件集目录不存在),那么它就会爆炸。我尝试使用try-catch包围ant副本以捕获InvokerInvocationException,但无论如何异常都会通过...当我跟踪它时,有没有办法将Groovy Closure的内容作为字符串读回,或者测试它是否为空?
答案 0 :(得分:1)
简而言之:否。您无法在运行时以有意义的方式反编译闭包。如果是用户提供的,那么Closure甚至可以是Java类。
答案很长:如果你想做很多工作,你可能会,但它可能不值得。 Groovy解析器是API的一部分,因此如果您有权访问源,理论上可以检查AST并确定闭包是否为空。查看SourceUnit课程。
这几乎肯定不值得努力。你最好捕获异常并添加一条有用的消息,例如“你可能已经通过了一个空的闭包或无效的文件集”。
答案 1 :(得分:0)
解决了一个谜 - 我需要捕获的异常是org.apache.tools.ant.BuildException - 所以我可以抓住它来捕获错误,但原始问题仍然存在 - 有没有办法检查Closure的内容?