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

Exception 如何在Groovy(soapui/readyapi)中使用异常获取错误行号,exception,groovy,error-handling,exception-handling,soapui,Exception,Groovy,Error Handling,Exception Handling,Soapui,当我们运行代码1时,soapui/readyapi中的错误如下 请注意:-错误消息中可见行号 但是,为了避免此警报,我们使用try/catch打印此警报,因此将上述代码修改为下面的代码2 //Code 1 log.info undefined 当我们运行代码2时,我们得到以下结果 //code 2 try { log.info undefined } catch(Exception e) { log.info e } 问题:-我们如何才能看到问题所在的行号,就像我们在代码1中

当我们运行代码1时,soapui/readyapi中的错误如下

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

但是,为了避免此警报,我们使用try/catch打印此警报,因此将上述代码修改为下面的代码2

  //Code 1 
  log.info undefined
当我们运行代码2时,我们得到以下结果

//code 2
try
{
log.info undefined
}
catch(Exception e)
{
log.info e  
}
问题:-我们如何才能看到问题所在的行号,就像我们在代码1中看到的那样

要求:-我们的异常块应该能够判断问题在哪一行


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

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

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

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

2018年3月19日星期一17:15:20 GMT: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.callgroovyObjectProperty(abstractCallCallCallSite.java:231),Script21.run(Script21.groovy:3),com.eviware.soapui.support.scripting.groovy.soapuigroovysscriptengine.run(soapuigroovysscriptengine.java:100),com.eviware.soapui.support.scripting.groovy.soapuiprogroovysscriptenginefactory$soapuiprogroovysscriptengine.run(源文件: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必须为脚本使用内部编号,因为我将脚本称为“伪Groovy脚本”,堆栈跟踪显示为“Script21”

无论如何,我确实认为您应该看看您的Groovy脚本,一次尝试100多行似乎有点多,当您退出时,很难看到这个问题

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


SmartBear网站介绍了如何做到这一点。此外,它还从SoapUI项目文件中删除了大量膨胀。

基于@tim_-yates使用
e.stackTrace.head().linenumber的答案:

try
{
log.info undefined
}
catch(Exception e)
{
log.info e.getStackTrace().toString();
}
对异常使用
sanitize()
,从异常的堆栈跟踪中删除所有奇怪的Groovy内部内容。否则,当您查看第一个StackTraceElement时,它可能不是您想要的


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

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

我使用Chris answer的以下解决方案,并充分尊重您的答案

import org.codehaus.groovy.runtime.StackTraceUtils 

try {
    println undefined
} catch (Exception e) {
    StackTraceUtils.sanitize(e)
    e.stackTrace.head().lineNumber
}
我使用这个答案的原因是我可以避免在所有脚本中导入。 我使用了模式匹配来提取行号,因为它总是这样

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]
}
所以我使用了这个模式
/groovy.(\d+)/

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


如果您使用
log.error
,它会显示行号吗?@tim_-yates不仅颜色变为红色,错误消息仍然是关于
e.stackTrace.head().lineNumber
的相同方式?很抱歉,我不是soapui用户:-(嗨,我刚刚试过,这应该是被接受的答案。从来都不知道消毒,很好的一个Jeremy。是的,答案被接受了,它符合要求。但是我使用了模式匹配的答案。请查看该答案并分享您的观点@Jeremy@jeremy有时我在e.stackTrace.head()中遇到错误.lineNumber..Error=无法从空数组中访问first()元素,请检查我使用您的@chrissometimes e.getStackTrace().toString()生成的答案返回null,这背后的原因是什么..在这种情况下,解决方案不能很好地工作您是说在一个特定的脚本中,有时返回堆栈,有时不返回堆栈?或者,您是否已将此catch部分复制到其他groovy脚本中?是的。我的一个测试用例失败。我查看了groovy并再次运行它,结果出现了如下异常此Fri Mar 23 17:01:42 IST 2018:错误:java.util.NoSuchElementException:无法从空数组访问first()元素…并且能够复制..看起来getStacktrace正在变为空
(Script18.groovy:17),