我可以在eval';中获取错误的行号吗;Groovy脚本?

我可以在eval';中获取错误的行号吗;Groovy脚本?,groovy,Groovy,我有一段代码,用于运行用户提供的Groovy脚本,如下所示: def scriptText = <something user entered> def manager = new ScriptEngineManager() def engine = manager.getEngineByName('Groovy') try { engine.eval(scriptText) } catch (ScriptException e) { println 'Script

我有一段代码,用于运行用户提供的Groovy脚本,如下所示:

def scriptText = <something user entered>
def manager = new ScriptEngineManager()
def engine = manager.getEngineByName('Groovy')

try {
    engine.eval(scriptText)
}
catch (ScriptException e) {
    println 'Script error at line ' + e.getLineNumber() + ', column ' + e.getColumnNumber() + ': ' + e.getMessage()
}
Exception in thread "main" groovy.lang.MissingPropertyException: No such property: blah for class: Script1
Possible solutions: class
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
    at Script1.run(Script1.groovy:6)  <---- this is the script error
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
    at groovy.util.Eval.me(Eval.java:68)
    at groovy.util.Eval.me(Eval.java:51)
    at groovy.util.Eval$me.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at com.kminnovations.metrics.engine.tester.Testing.parseFile(Testing.groovy:32)
    at com.kminnovations.metrics.engine.tester.Testing$parseFile.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
    at com.kminnovations.metrics.engine.tester.MetricsEngineTester.main(MetricsEngineTester.groovy:23)
我还尝试调用Eval.me(scriptText),因为调用代码也是Groovy,但随后我得到了一个很大的堆栈跟踪,其中隐藏了脚本错误的原因,如下所示:

def scriptText = <something user entered>
def manager = new ScriptEngineManager()
def engine = manager.getEngineByName('Groovy')

try {
    engine.eval(scriptText)
}
catch (ScriptException e) {
    println 'Script error at line ' + e.getLineNumber() + ', column ' + e.getColumnNumber() + ': ' + e.getMessage()
}
Exception in thread "main" groovy.lang.MissingPropertyException: No such property: blah for class: Script1
Possible solutions: class
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
    at Script1.run(Script1.groovy:6)  <---- this is the script error
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
    at groovy.util.Eval.me(Eval.java:68)
    at groovy.util.Eval.me(Eval.java:51)
    at groovy.util.Eval$me.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at com.kminnovations.metrics.engine.tester.Testing.parseFile(Testing.groovy:32)
    at com.kminnovations.metrics.engine.tester.Testing$parseFile.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
    at com.kminnovations.metrics.engine.tester.MetricsEngineTester.main(MetricsEngineTester.groovy:23)
线程“main”groovy.lang.MissingPropertyException中的异常:没有此类属性:类:Script1的blah 可能的解决方案:类 位于org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50) 位于org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49) 位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
在Script1.run(Script1.groovy:6)中,我认为您仍然可以通过导航到根本原因并搜索ScriptN.groovy之类的源代码,因为
ScriptEngineManager
将自动为每个执行的脚本生成此名称

def manager = new ScriptEngineManager()
def engine = manager.getEngineByName('Groovy')

try {
    engine.eval(scriptText)
} catch (javax.script.ScriptException e) {
    def cause = rootCause(e)
    def line = cause.stackTrace.find { 
        it.fileName ==~ /^Script\d+\.groovy$/ 
    }.lineNumber
    println "Line $line: $cause.message"
}

def rootCause(Exception e) {
    Throwable t = e;
    while (t.cause != null) t = t.cause;
    t
}

您可能需要像apache.commons.ExceptionUtils中那样使用更复杂的
rootCause
,这将停止groovy的执行。在不终止或停止groovy执行的情况下,我们还有其他方法捕获行号吗?