【发布时间】:2015-11-13 23:26:36
【问题描述】:
我们可以使用下面的代码在运行时创建和运行 groovyscript
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import java.io.File;
import java.io.IOException;
// Create a String with Groovy code.
final StringBuilder groovyScript = new StringBuilder();
groovyScript.append("class Sample {");
groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }");
groovyScript.append("}");
GroovyClassLoader gcl = new GroovyClassLoader()
GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE)
//GCL will check for enabled cache over code source and use sourceCache to cache code with name
def scriptClass = gcl.parseClass(codeSource)
def classInstance = scriptClass.newInstance()
assert "Groovy says: Cool jajaja".equals(classInstance.sayIt())
现在假设在上面的代码中,我们引入了一个错误,现在上面的代码如下:
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import java.io.File;
import java.io.IOException;
// Create a String with Groovy code.
final StringBuilder groovyScript = new StringBuilder();
groovyScript.append("class Sample {");
groovyScript.append("jajaja");
groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }");
groovyScript.append("}");
GroovyClassLoader gcl = new GroovyClassLoader()
GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE)
//GCL will check for enabled cache over code source and use sourceCache to cache code with name
def scriptClass = gcl.parseClass(codeSource)
def classInstance = scriptClass.newInstance()
assert "Groovy says: Cool jajaja".equals(classInstance.sayIt())
注意,我们在类声明后的脚本中添加了“jajaja”。
这里应该怎么做才能知道我们的脚本有编译错误并且会因 MissingPropertyException 或其他异常而失败。
当尝试与 groovyConsole 相同时,它会破坏脚本并出现以下错误
1 compilation error:
unexpected token: jajaja at line: 1, column: 15
我们可以在运行之前测试脚本是否有任何编译错误吗? 为这段代码添加 try catch 块对我不起作用。
【问题讨论】:
-
将
gcl.parseClass包裹在try...catch中?不要以为我理解这个问题...... -
我同意蒂姆的观点,不明白是什么问题,解决方案还可以。捕获 MultipleCompilationErrorsException 和可能 CompilationFailedException
-
你不能测试一些不存在的会失败的东西。 Sample 类在您运行脚本之前不存在。你是在问是否有办法告诉
groovyScript告诉你它是否会先失败?我不确定他们会给你买什么,因为无论如何你都必须运行它才能走得那么远。 -
@Gregg 我正在从可修改的前端添加脚本数据(脚本是域的属性)。如果有人像上面的例子一样改变它,应该检查它是否有任何验证错误。所以,我正在编写一个自定义验证器,我想验证脚本字段至少有一个没有编译错误的编译脚本。
-
添加了 try catch 块什么也没发生。但我得到了我在下面发布的答案。
标签: grails groovy grails-plugin grails-2.0