测试空groovy闭包?
我想让用户为groovy类提供一个属性,该属性是一个文件选择器闭包,我将其传递给AntBuilder的“复制”任务:测试空groovy闭包?,groovy,closures,Groovy,Closures,我想让用户为groovy类提供一个属性,该属性是一个文件选择器闭包,我将其传递给AntBuilder的“复制”任务: class Foo { def ANT = { fileset(dir:'/tmp/tmp1') } } 在我的代码中,我选择ANT属性作为“fAnt”并传递给ANT: ant.copy(todir:'/tmp/tmp2', fAnt) 这是可行的——但是,如果用户传入一个空闭包(def ANT={}),或者使用一个没有选择任何内容的选择器(可能files
class Foo {
def ANT = { fileset(dir:'/tmp/tmp1') }
}
在我的代码中,我选择ANT属性作为“fAnt”并传递给ANT:
ant.copy(todir:'/tmp/tmp2', fAnt)
这是可行的——但是,如果用户传入一个空闭包(def ANT={}),或者使用一个没有选择任何内容的选择器(可能fileset dir不存在),那么它就会崩溃。我试图用一个try-catch来包围ant副本,以捕获调用异常,但无论如何异常都会出现。。。在我追踪的过程中,有没有办法将groovy闭包的内容作为字符串读回,或者测试它是否为空?一个谜团被解开了——我需要捕获的异常是org.apache.tools.ant.BuildException——所以我可以捕获它来捕获错误,但最初的问题仍然存在——有没有办法检查闭包的内容?一个谜团已经解开——我需要捕获的异常是org.apache.tools.ant.BuildException——所以我可以捕获它来捕获错误,但最初的问题仍然存在——有没有办法检查闭包的内容?简言之:没有。您无法在运行时以有意义的方式反编译闭包。如果它是用户提供的,那么闭包甚至可以是一个Java类 长句回答:如果你想做很多工作,你也许可以,但这可能不值得。Groovy解析器是API的一部分,因此如果您可以访问源代码,理论上可以检查AST并确定闭包是否为空。看看这个班
不过,几乎可以肯定,这不值得付出努力。您最好捕获异常并添加一条有用的消息,如“您可能传递了一个空的闭包或无效的文件集”。简言之:不。您不能在运行时以有意义的方式反编译闭包。如果它是用户提供的,那么闭包甚至可以是一个Java类 长句回答:如果你想做很多工作,你也许可以,但这可能不值得。Groovy解析器是API的一部分,因此如果您可以访问源代码,理论上可以检查AST并确定闭包是否为空。看看这个班 不过,几乎可以肯定,这不值得付出努力。您最好捕获异常并添加一条有用的消息,如“您可能传递了一个空的闭包或无效的文件集”