脚本化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
相关产品推荐
相关产品推荐

