groovy - Jenkins cps groovy 未捕获 NoSuchMethodError 异常

标签 groovy jenkins-pipeline jenkins-groovy

当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/

相关文章:

gradle - 如何诊断/解决gradle构建未运行依赖项任务的问题?

java - Jmeter - 将文件从一台主机复制到另一台主机

python - 根据文件夹更改的数量触发多个 Jenkins 作业

jenkins - 版本号插件导致管道解析错误

jenkins - 如何知道 Jenkins 作业的运行时间

groovy - 如何检查方法是否在 Groovy 中返回非零退出代码

database-design - GORM ID的生成和belongsTo关联?

json - 使用 ${params} 将 jenkins 的所有参数写入 JSON 文件中

jenkins-pipeline - 使用 readFile 从文件中读取数据并将其转换为 groovy 中的列表的最佳方法是什么?

jenkins - Jenkins 管道中触发器指令的条件