4

我的工作流在使用 try-catch 失败时发送邮件。我还启用了并发,因此,当同一工作流的多个作业进入节流阶段时,新作业会取消旧作业。这会抛出异常"org.jenkinsci.plugins.workflow.steps.FlowInterruptedException"并且取消的作业也会触发邮件通知。

现在我已经修改了我的工作流程以捕获特定FlowInterruptedException异常并抑制邮件通知并让其他任何事情来触发邮件,就像这样。

node {
try {
// some stages for the workflow
}

catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){

        echo "the job was cancelled or aborted"
         }

 catch (err){ 
         stage 'Send Notification' 
         mail (to: 'adminj...@somename.com', 
         subject: "Job '${env.JOB_NAME}' (${env.BUILD_NUMBER}) has had an error.", 
              body: "Some text", 
            mimeType:'text/html'); 
         currentBuild.result = 'FAILURE' 
     } 

}

这仅捕获FlowInterruptedException并且当作业由于任何其他原因(命令拼写错误等)而真正失败时,我期望它会被另一个捕获并触发其中的代码以发送邮件。但事实并非如此。

我认为我的代码在 try catch 中有一些缺陷。任何想法?

更新:

以防万一,如果我使用下面的代码,它只会发送邮件以解决任何故障

node {
try {
// some stages for the workflow
}

catch (err){ 
         stage 'Send Notification' 
         mail (to: 'adminj...@somename.com', 
         subject: "Job '${env.JOB_NAME}' (${env.BUILD_NUMBER}) has had an error.", 
              body: "Some text", 
            mimeType:'text/html'); 
         currentBuild.result = 'FAILURE' 
     } 

}
4

2 回答 2

2

您可以捕捉FlowInterruptedException- 正如您现在所做的那样 - 然后检查其原因之一 ( FlowInterruptedException#getCauses()) 是org.jenkinsci.plugins.workflow.support.steps.StageStepExecution.CanceledCause,这意味着在等待进入stage步骤时流程被中断。

任何其他组合都是有资格发送通知电子邮件的合法错误。

于 2016-02-27T14:09:11.847 回答
0

也许这会有所帮助。在 else 语句中,您可以提出进一步的条件。

try{
} catch (Exception e) {
            if (e.toString() == "org.jenkinsci.plugins.workflow.steps.FlowInterruptedException"){
                println e.toString()
                echo "job was cancelled or aborted"
            } else {
                echo "DEBUG: caught error."
                println e.toString()
                currentBuild.result = 'FAILURE'
            }
        }
于 2022-02-23T05:18:04.333 回答