如何使用 Groovy (soapui/readyapi) 中的异常获取错误行号

How to get line number for error using exception in Groovy (soapui/readyapi)

  //Code 1 
  log.info undefined

当我们 运行 代码 1 时,我们在 soapui/readyapi 中得到以下错误,如

请注意:- 行号在错误消息中可见

但是为了避免这个提示,我们使用了try/catch来打印这个,所以上面的代码修改为下面的代码2

//code 2
try
{
log.info undefined
}
catch(Exception e)
{
log.info e  
}

当我们 运行 代码 2 时,我们得到以下结果

Mon Mar 19 15:04:16 IST 2018:INFO:groovy.lang.MissingPropertyException: No such property: undefined for class: Script6

问题 :- 我们如何才能看到问题所在的行号,就像我们在代码 1 中看到的那样

要求 :- 我们的异常块应该能够告诉问题出在哪一行。

由于它是我们能够知道的小代码,有时代码有 100 多行并且很难知道异常在哪里

您可以使用 log.info e.getStackTrace().toString(); 获取完整的堆栈跟踪。

但是,很难找出问题所在。这是我的 Groovy 脚本....

try
{
log.info undefined
}
catch(Exception e)
{
log.info e.getStackTrace().toString();
}

这是踪迹....

3 月 19 日星期一 17:15:20 格林威治标准时间 2018:INFO:[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), Script21.run(Script21.groovy:3), com.eviware.soapui.support.scripting.groovy.SoapUIGroovyScriptEngine.run(SoapUIGroovyScriptEngine.java:100), com.eviware.soapui.support.scripting.groovy.SoapUIProGroovyScriptEngineFactory$SoapUIProGroovyScriptEngine.run(SourceFile:89), com.eviware.soapui.impl.wsdl.teststeps.WsdlGroovyScriptTestStep.run(WsdlGroovyScriptTestStep.java:154), com.eviware.soapui.impl.wsdl.panels.teststeps.GroovyScriptStepDesktopPanel$RunAction$1.run(GroovyScriptStepDesktopPanel.java:277), java.util.concurrent.ThreadPoolExecutor.runWorker(来源不明), java.util.concurrent.ThreadPoolExecutor$Worker.run(来源不明), java.lang.Thread.run(来源不明)]

注意-有底气的部分。这是第 3 行,这正是我所期望的。但是,SoapUI 必须对脚本使用内部编号,因为我调用脚本 "Dummy Groovy Script" 并且堆栈跟踪显示 "Script21".

无论如何,我确实认为你应该看看你的 Groovy 脚本,Try 中的 100 多行似乎有点多,而且当你 pint 出来时,很难看出问题所在。

我建议将其分解为函数,或者更好的是,调用 SoapUI 外部的 Java class,它具有很好的 well-defined 函数。

SmartBear 网站描述了如何做到这一点。此外,它还消除了 SoapUI 项目文件中的大量膨胀内容。

基于@tim_yates 使用 e.stackTrace.head().linenumber 的回答:

import org.codehaus.groovy.runtime.StackTraceUtils 

try {
    println undefined
} catch (Exception e) {
    StackTraceUtils.sanitize(e)
    e.stackTrace.head().lineNumber
}

在异常上使用 sanitize() 以从异常的堆栈跟踪中删除所有奇怪的 Groovy 内部内容。否则,当您查看第一个 StackTraceElement 时,它可能不是您想要的。

deepSanitize() 是相同的,但也将转换应用于所有嵌套异常(如果有的话)。

感谢 Chris 和 Jeremy 解决了我的问题。

我完全尊重您的回答,使用了以下使用 Chris 回答的解决方案

try
{
log.info undefined
}
catch(Exception e)
{
log.error "Exception = " + e    

String str= e.getStackTrace().toString()

def pattern = ( str =~ /groovy.(\d+)./   )

log.error " Error at line number = " + pattern[0][1]
}

我使用该答案的原因是我可以避免在我的所有脚本中导入。 我使用模式匹配来提取行号,因为它总是像

(Script18.groovy:17),

所以我使用了这个模式 /groovy.(\d+)./

现在我得到了异常详细信息和行号