2009-12-30 41 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的內容?