当groovy代码调用不存在的方法时,是否有办法捕获NoSuchMethodError错误?
以下代码会导致 NoSuchMethodError 错误,该错误未被捕获,但finally block 确实执行。这会导致我的一些错误处理和报告出现问题。
带有伪造 dsl 的代码
try {
println "in try"
dslDoesNotExist()
} catch (Exception ex) {
println "Caught error ${ex}"
throw ex
} finally {
println "finally block"
}
结果
in try
[Pipeline] echo
finally block // see the finally but not the catch
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method 'dslDoesNotExist'
如果我修改要引用不存在的属性/变量的代码,则处理 catch block
缺少属性的代码
try {
println "in try"
propertyOrVariableDoesNotExist
} catch (Exception ex) {
println "Caught error ${ex}"
throw ex
} finally {
println "finally block"
}
结果
in try
[Pipeline] echo
Caught error groovy.lang.MissingPropertyException: No such property: propertyOrVariableDoesNotExist for class: WorkflowScript
[Pipeline] echo
finally block
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No such property: propertyOrVariableDoesNotExist for class:
这里发生了什么
Java 与 Groovy 异常?
CPS groovy catch(Exception ex) 可以捕获 java.lang.异常(exception)情况?否
代码
try {
throw new java.lang.NoSuchMethodError("dsl problem")
} catch (Exception ex) {
println "Caught"
}
结果
// No evidence of the catch
[Pipeline] { (hide)
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: dsl problem
最佳答案
感谢@jeff-scott-brown,因为他是对的。我们需要进行一些挖掘和实验才能弄清楚这一点。我错了。
NoSuchMethodError的祖先看起来像
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.LinkageError
java.lang.IncompatibleClassChangeError
java.lang.NoSuchMethodError
Groovy Exception的祖先是
java.lang.Throwable
java.lang.Exception
org.codehaus.groovy.GroovyException
所以,如果我将代码重构为此,它就会按预期工作。当我最初测试这个时,我遇到了一个安全沙箱错误,该错误混淆了结果,我错过了它(它很明显,所以我不知道我是如何错过它的,但我做到了)
代码
try {
dslNotExist()
} catch (java.lang.Throwable ex) {
println "Caught"
}
结果
[Pipeline] {
[Pipeline] echo
Caught
[Pipeline] }
[Pipeline] // node
关于groovy - Jenkins cps groovy 未捕获 NoSuchMethodError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63927272/