Jenkins cps groovy不捕获NoSuchMethodError异常

Jenkins cps groovy不捕获NoSuchMethodError异常,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,当groovy代码调用一个不存在的方法时,是否仍然可以捕获NoSuchMethodError错误 下面的代码导致NoSuchMethodError错误,该错误未被捕获,但最终执行块。这会给我的一些错误处理和报告带来问题 伪dsl代码 结果 如果修改要引用不存在的属性/变量的代码,将处理catch块 缺少属性的代码 结果 这是怎么回事 Java vs Groovy异常? CPS groovy catch(异常ex)能否捕获java.lang。例外情况?没有 代码 结果 感谢@jeff scott

当groovy代码调用一个不存在的方法时,是否仍然可以捕获NoSuchMethodError错误

下面的代码导致NoSuchMethodError错误,该错误未被捕获,但最终执行块。这会给我的一些错误处理和报告带来问题

伪dsl代码 结果 如果修改要引用不存在的属性/变量的代码,将处理catch块

缺少属性的代码 结果 这是怎么回事 Java vs Groovy异常? CPS groovy catch(异常ex)能否捕获java.lang。例外情况?没有

代码 结果
感谢@jeff scott brown,因为他是对的。这需要一些挖掘和实验才能弄清楚。我错了

它的祖先看起来像

 java.lang.Object
    java.lang.Throwable
        java.lang.Error
            java.lang.LinkageError
                java.lang.IncompatibleClassChangeError
                    java.lang.NoSuchMethodError 
人类的祖先是

因此,如果我将代码重构为这样,它将按预期工作。当我最初测试它时,我遇到了一个安全沙盒错误,它混淆了结果,我错过了它(它非常明显,所以我不知道我是如何错过它的,但我确实错过了)

代码 结果
这段代码的上下文是什么?它是库、全局变量、脚本块还是本机脚本DSL?您希望该方法通常在哪里定义?请注意,在第一个不成功的示例中,您试图捕获Groovy中的Java异常,在第二个成功的示例中,您试图捕获Groovy中的Groovy异常。如果选择的回购分支机构缺乏这种方法,那么我们就会遇到这个问题。我原以为catch可以捕获所有内容,但事实并非如此。我还尝试了catch(java.lang.NoSuchMethodError){…},但也不起作用。
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'
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: 
    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
 java.lang.Object
    java.lang.Throwable
        java.lang.Error
            java.lang.LinkageError
                java.lang.IncompatibleClassChangeError
                    java.lang.NoSuchMethodError 
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