首页 文章

测试空的groovy闭合?

提问于
浏览
1

我想让用户提供一个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的内容作为字符串读回,或者测试它是否为空?

2 回答

  • 1

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

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

    尽管如此,这几乎肯定不值得 . 您最好捕获异常并添加一条有用的消息,例如“您可能已经通过了空关闭或无效的文件集” .

  • 0

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

相关问题