You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

脚本化Jenkins流水线阶段失败异常被跳过仍运行的修复方法

问题现象

现有脚本式Jenkins流水线代码如下:

func_stage_1() {
    try {
        stage1
    } catch {
    }
}
func_stage_1()

未将stage封装到函数内部时,任意stage执行失败,流水线会直接终止并打印对应异常信息;将stage封装进函数后,单个stage执行失败,整个流水线仍会继续向后执行。

根因分析

核心问题是函数里写的空catch块把异常吞了:

  • 脚本式Jenkins流水线的stage执行失败,本质是抛出了执行异常,没有捕获逻辑时,异常会逐层向上传递给流水线引擎,触发默认的终止逻辑。
  • 无任何处理逻辑的空catch会把stage抛出的所有异常直接拦截,不会继续向上传递,流水线引擎感知不到stage执行失败,自然会继续运行后续步骤。
  • 这个现象和是否封装函数没有直接关系,就算不拆函数,直接给stage套一层空try-catch,也会出现同样的问题。
修复方法

根据实际需求二选一即可:

  • 不需要在stage失败时做自定义处理:直接删掉多余的try-catch块,让异常正常向上抛出即可,示例代码:
func_stage_1() {
    stage('Stage 1') {
        // 此处写stage1的实际业务逻辑
    }
}
func_stage_1()
  • 需要在stage失败时做自定义操作(比如打印自定义日志、清理临时资源、发送失败通知):在catch块里写完自定义逻辑后,必须手动把捕获到的异常重新抛出,让流水线引擎能接收到失败信号,示例代码:
func_stage_1() {
    try {
        stage('Stage 1') {
            // 此处写stage1的实际业务逻辑
        }
    } catch (Exception e) {
        // 自定义处理逻辑,比如打印错误、清理资源、发通知
        echo "Stage 1执行失败,错误信息:${e.getMessage()}"
        // 核心步骤:重新抛出异常,触发流水线终止
        throw e
    }
}
func_stage_1()

补充说明:Jenkins流水线底层基于Groovy执行,不指定异常类型的catch块默认会捕获所有Throwable类型的异常,包括流水线内置的终止信号类异常,空catch吞异常是脚本式流水线开发里非常高频的踩坑点。

内容的提问来源于stack exchange,提问作者user2636464

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:54:22