2009-12-30 40 views
1

我想让用户提供一个Groovy类是一个文件选择器关闭,我传给AntBuilder的“复制”任务属性:测试空常闭合?

class Foo { 
    def ANT = { fileset(dir:'/tmp/tmp1') } 
    } 
在我的代码

,我拿起ANT财产“FANT”和传递到Ant:

ant.copy(todir:'/tmp/tmp2', fAnt) 

这工作 - 但是,如果用户通过在一个空的封闭件(DEF ANT = {}),或与一种选择器,不选择任何东西(也许文件集目录不存在),那么它爆炸了。我尝试用try-catch来捕获InvokerInvocationException,但不知何故,异常通过反正......当我跟踪它时,有没有办法将groovy Closure的内容读回为字符串,或者测试它是否为空?

回答

1

简而言之:不可以在运行时以有意义的方式反编译闭包。如果它是用户提供的,Closure甚至可以是Java类。

长答案:如果你想做很多工作,你可能可以,但这可能不值得。 Groovy解析器是API的一部分,因此如果您有权访问源代码,则理论上可以检查AST并确定闭包是否为空。看看SourceUnit课程。

虽然这几乎肯定不值得。您最好捕捉异常并添加一条有用的消息,例如“您可能传递了空的闭包或无效的文件集”。

0

解决了一个谜 - 我需要捕捉的异常是org.apache.tools.ant.BuildException - 所以我可以抓住它来捕获错误,但原始问题仍然存在 - 是否有方法检查Closure的内容?