加载groovy文件时捕获异常

加载groovy文件时捕获异常,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,我有以下3个groovy文件: A.groovy: // ... stage("Test") { throw new Exception("This script fails") } B.groovy: // ... stage("Test") { // Nothing, want this to pass } main.groovy: // ... m = [:] status = [:] scripts = ["A", "B"] for script in scripts

我有以下3个groovy文件:

A.groovy:

// ...
stage("Test")
{
    throw new Exception("This script fails")
}
B.groovy:

// ...
stage("Test")
{
    // Nothing, want this to pass
}
main.groovy:

// ...
m = [:]
status = [:]
scripts = ["A", "B"]
for script in scripts
{
    m["${script}"] = 
    {
        stage("${script}")
        {
            try
            {
                 load "${script}.groovy"
                 status["${script}"] = true
            }
            catch (Exception e)
            {
                 status["${script}"] = false   
            }
        }
    }
}

parallel m

for result_iterator in status:
    print "${result_iterator.key} resulted in ${result_iterator.value}"
上面的代码是真实代码的草图=) 当我运行main.groovy在状态字典中查看结果时,我只看到B.A抛出了一个异常,因此它没有将自己添加到字典中。有什么方法可以捕获a的异常吗?

问题1 Groovy闭包捕获超出其作用域的变量的方式让您感到痛苦。闭包中对
script
的引用将在闭包运行时接收
script
的值,这将是
script
最后一个值。因此,两个闭包实际上都加载了“B.groovy”,并且从不抛出异常

修复方法很简单,只需在循环内创建一个局部变量,以捕获
脚本的当前值即可:

for(脚本中的脚本){
def theScript=脚本
//现在只使用闭包内部的脚本!
}
问题2 您没有从
并行
线程序列化对
状态
变量的写访问。这可能会导致非常讨厌的、难以复制的错误

修复程序将用于创建:

status=[:].asSynchronized()
完成“main.groovy”修复
m=[:]
状态=[:].asSynchronized()//因为多个线程写入此变量
脚本=[“A”,“B”]
for(脚本中的脚本){
def theScript=script//将当前值传递到闭包中很重要!
m[theScript]={
阶段(脚本){
试一试{
加载“${theScript}.groovy”
状态[脚本]=真
}
捕获(例外e){
状态[脚本]=false
}
}
}
}
平行m
for(结果\迭代器处于状态){
打印“${result\u iterator.key}结果为${result\u iterator.value}”
}

注意:我还删除了不必要的字符串插值。

那么你的意思是“A.groovy”引发的异常没有被
catch
块捕获?正是@zett42Amazing!修复起了作用。谢谢!:)