Try-catch block in Jenkins pipeline script

Publish date: 2024-05-15

I'm trying to use the following code to execute builds, and in the end, execute post build actions when builds were successful. Still, I get a MultipleCompilationErrorsException, saying that my try block is Not a valid section definition. Please help, I tried a lot reorganize the block but can't seem to be able to solve the issue.

pipeline{ agent any try { stages{ stage("Parallel 1") { steps { parallel ( 'firstTask' : { build( "DSL-Controll-Demo-Fibonacci-1" ) }, 'secondTask' : { build( "DSL-Controll-Demo-Fibonacci-2" ) } ) } } stage("Feature") { steps { build( "DSL-Controll-Demo-Fibonacci-5" ) build( "DSL-Controll-Demo-Fibonacci-6" ) } } stage("Parallel 2") { steps{ parallel ( "thirdTask" : { build( "DSL-Controll-Demo-Fibonacci-3" ) }, "forthTask" : { build( "DSL-Controll-Demo-Fibonacci-4" ) } ) } } } } catch(all) { currentBuild.result = 'FAILURE' } if(currentBuild.result != 'FAILURE') { stages{ stage("Post Build") { steps { build("DSL-Controll-Demo-Fibonacci-7") } } } } } 

4 Answers

try like this (no pun intended btw)

script { try { sh 'do your stuff' } catch (Exception e) { echo 'Exception occurred: ' + e.toString() sh 'Handle the exception!' } } 

The key is to put try...catch in a script block in declarative pipeline syntax. Then it will work. This might be useful if you want to say continue pipeline execution despite failure (eg: test failed, still you need reports..)

1

You're using the declarative style of specifying your pipeline, so you must not use try/catch blocks (which are for Scripted Pipelines), but the post section. See: https://jenkins.io/doc/book/pipeline/syntax/#post-conditions

3

Look up the AbortException class for Jenkins. You should be able to use the methods to get back simple messages or stack traces. In a simple case, when making a call in a script block (as others have indicated), you can call getMessage() to get the string to echo to the user. Example:

script { try { sh "sudo docker rmi frontend-test" } catch (err) { echo err.getMessage() echo "Error detected, but we will continue." } ...continue with other code... } 

try/catch is scripted syntax. So any time you are using declarative syntax to use something from scripted in general you can do so by enclosing the scripted syntax in the scripts block in a declarative pipeline. So your try/catch should go inside stage >steps >script.

This holds true for any other scripted pipeline syntax you would like to use in a declarative pipeline as well.

ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoa21oYGiEeYSOramyZZOWwaS0jJujqJubYravecmepaShnqh6sbXPnqOippViwKS%2ByKmr