'Catching multiple errors in Jenkins workflow
My workflow sends mails when it fails using a try-catch. i have also enable concurrency and with this, when multiple jobs of the same workflow enters into a throttling stage, the new ones cancels the older ones. This throw an exception of "org.jenkinsci.plugins.workflow.steps.FlowInterruptedException" And canceled jobs also triggers the mail notification.
Now i have modified my workflow to catch the specific FlowInterruptedException exception and suppress the mail notice and let anything else to trigger the mail, like so.
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: '[email protected]',
subject: "Job '${env.JOB_NAME}' (${env.BUILD_NUMBER}) has had an error.",
body: "Some text",
mimeType:'text/html');
currentBuild.result = 'FAILURE'
}
}
This is catching only the FlowInterruptedException and when the job really fails due to any other reason (command typo, etc), i was expecting it will be caught by the other catch and will trigger the code inside it to send the mail. But it isn't.
I think my code have some flaw in the try catch. Any idea?
UPDATE:
Just incase, if i use the below code it just send mail for just about any failures
node {
try {
// some stages for the workflow
}
catch (err){
stage 'Send Notification'
mail (to: '[email protected]',
subject: "Job '${env.JOB_NAME}' (${env.BUILD_NUMBER}) has had an error.",
body: "Some text",
mimeType:'text/html');
currentBuild.result = 'FAILURE'
}
}
Solution 1:[1]
You can catch FlowInterruptedException - as you are doing now - and then check one of its causes (FlowInterruptedException#getCauses()) is org.jenkinsci.plugins.workflow.support.steps.StageStepExecution.CanceledCause, which means that the flow was interrupted while waiting to enter a stage step.
Any other combination is a legitimate error eligible to send the notification email.
Solution 2:[2]
Maybe this could help. In the else statement you can put your further conditions.
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'
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | amuniz |
| Solution 2 | Ranjith Pandurangan |
