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

时间:2018-03-19 09:46:25

标签: exception groovy error-handling exception-handling soapui

  //Code 1 
  log.info undefined

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

enter image description here

请注意: - 错误消息中可以看到行号

但是为了避免这种警告,我们使用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

问题: - 我们怎样才能看到问题就像我们在code1中看到的行号

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

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

3 个答案:

答案 0 :(得分:4)

以@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
}

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

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

答案 1 :(得分:1)

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

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

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

这里是追踪......

Mon Mar 19 17:15:20 GMT 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(Unknown Source),java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source),java.lan g.Thread.run(未知来源)]

注意 - 胆大的部分。这是第3行,这就是我的预期。但是,SoapUI必须使用脚本的内部编号,因为我调用了脚本" Dummy Groovy Script"堆栈跟踪说" Script21"。

无论如何,我确实认为你应该看看你的Groovy脚本,在Try中有100多行看起来有点多,当你发现时,很难看出这个问题。

我建议将其分解为函数,或者甚至更好地调用SoapUI外部的Java类,它具有良好定义的函数。

SmartBear网站描述了如何做到这一点。另外,它从SoapUI项目文件中删除了大量的膨胀。

答案 2 :(得分:1)

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

我使用了以下解决方案,使用克里斯答案,并完全尊重你的答案

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+)./

现在我得到了例外细节和行号

enter image description here