如何使用 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+)./
现在我得到了异常详细信息和行号
//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+)./
现在我得到了异常详细信息和行号