Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-45379

An error in a "finally" block will result in squelching the original exception thrown

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Minor Minor
    • workflow-cps-plugin
    • None

      Considering the following contrived Jenkinsfile:

      node {
          try {
              echo "I'm too cool to stash"
              1 / 0 
          }
      finally {
              unstash 'invalid'
              echo "Did you see the exception?"
          }
      }
      

      The exception thrown in the try block will never ever get printed in the Console Output. This is pretty frustrating as it hides the original error from me :'(, see below:

      Started by user admin
      Replayed #3
      [Pipeline] node
      Running on master in /var/jenkins_home/workspace/foo
      [Pipeline] {
      [Pipeline] echo
      I'm too cool to stash
      [Pipeline] unstash
      [Pipeline] }
      [Pipeline] // node
      [Pipeline] End of Pipeline
      ERROR: No such saved stash ‘invalid’
      Finished: FAILURE
      

          [JENKINS-45379] An error in a "finally" block will result in squelching the original exception thrown

          Liam Newman added a comment -

          Considering the following contrived Jenkinsfile:

          node {
              try {
                  echo "I'm too cool to stash"
                  unstash 'invalid'
              }
          finally {
                  1 / 0 
                  echo "Did you see the exception?"
              }
          }
          
          Started by user Liam Newman
          [Pipeline] node
          Running on blueocean-host in /home/bitwiseman/jenkins/blueocean-host/workspace/test-pipe
          [Pipeline] {
          [Pipeline] echo
          I'm too cool to stash
          [Pipeline] unstash
          [Pipeline] }
          [Pipeline] // node
          [Pipeline] End of Pipeline
          java.lang.ArithmeticException: Division by zero
          	at java.math.BigDecimal.divide(BigDecimal.java:1742)
          	at org.codehaus.groovy.runtime.typehandling.BigDecimalMath.divideImpl(BigDecimalMath.java:68)
          	at org.codehaus.groovy.runtime.typehandling.IntegerMath.divideImpl(IntegerMath.java:49)
          	at org.codehaus.groovy.runtime.typehandling.NumberMath.divide(NumberMath.java:68)
          	at org.codehaus.groovy.runtime.dgmimpl.NumberNumberDiv.invoke(NumberNumberDiv.java:32)
          	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
          	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
          	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
          	at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:47)
          	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
          	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
          	at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151)
          	at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21)
          	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:82)
          	at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
          	at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
          	at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:16)
          	at WorkflowScript.run(WorkflowScript:7)
          	at ___cps.transform___(Native Method)
          	at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
          	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
          	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
          	at sun.reflect.GeneratedMethodAccessor231.invoke(Unknown Source)
          	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          	at java.lang.reflect.Method.invoke(Method.java:498)
          	at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
          	at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
          	at com.cloudbees.groovy.cps.Next.step(Next.java:83)
          	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:173)
          	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:162)
          	at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
          	at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
          	at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:162)
          	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
          	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35)
          	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:32)
          	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
          	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:32)
          	at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:330)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
          	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
          	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
          	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
          	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
          	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
          	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
          	at java.lang.Thread.run(Thread.java:748)
          Finished: FAILURE

          Liam Newman added a comment - Considering the following contrived Jenkinsfile : node { try { echo "I'm too cool to stash" unstash 'invalid' } finally { 1 / 0 echo "Did you see the exception?" } } Started by user Liam Newman [Pipeline] node Running on blueocean-host in /home/bitwiseman/jenkins/blueocean-host/workspace/test-pipe [Pipeline] { [Pipeline] echo I'm too cool to stash [Pipeline] unstash [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline java.lang.ArithmeticException: Division by zero at java.math.BigDecimal.divide(BigDecimal.java:1742) at org.codehaus.groovy.runtime.typehandling.BigDecimalMath.divideImpl(BigDecimalMath.java:68) at org.codehaus.groovy.runtime.typehandling.IntegerMath.divideImpl(IntegerMath.java:49) at org.codehaus.groovy.runtime.typehandling.NumberMath.divide(NumberMath.java:68) at org.codehaus.groovy.runtime.dgmimpl.NumberNumberDiv.invoke(NumberNumberDiv.java:32) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:47) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151) at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:82) at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149) at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146) at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:16) at WorkflowScript.run(WorkflowScript:7) at ___cps.transform___(Native Method) at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57) at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109) at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82) at sun.reflect.GeneratedMethodAccessor231.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21) at com.cloudbees.groovy.cps.Next.step(Next.java:83) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:173) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:162) at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122) at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261) at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:162) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:32) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:32) at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:330) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang. Thread .run( Thread .java:748) Finished: FAILURE

          Liam Newman added a comment -

          Considering the following contrived Jenkinsfile:

          node {
              try {
                  echo "I'm too cool to stash"
                  unstash 'invalid1'
              }
          finally {
                  unstash 'invalid2'
                  1 / 0 
                  echo "Did you see the exception?"
              }
          }
          
          Started by user Liam Newman
          Replayed #27
          [Pipeline] node
          Running on blueocean-host in /home/bitwiseman/jenkins/blueocean-host/workspace/test-pipe
          [Pipeline] {
          [Pipeline] echo
          I'm too cool to stash
          [Pipeline] unstash
          [Pipeline] unstash
          [Pipeline] }
          [Pipeline] // node
          [Pipeline] End of Pipeline
          ERROR: No such saved stash ‘invalid2’
          Finished: FAILURE
          

          Liam Newman added a comment - Considering the following contrived Jenkinsfile : node { try { echo "I'm too cool to stash" unstash 'invalid1' } finally { unstash 'invalid2' 1 / 0 echo "Did you see the exception?" } } Started by user Liam Newman Replayed #27 [Pipeline] node Running on blueocean-host in /home/bitwiseman/jenkins/blueocean-host/workspace/test-pipe [Pipeline] { [Pipeline] echo I'm too cool to stash [Pipeline] unstash [Pipeline] unstash [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: No such saved stash ‘invalid2’ Finished: FAILURE

          Jesse Glick added a comment -

          Probably means groovy-cps needs to call Throwable.addSuppressedException somewhere.

          Jesse Glick added a comment - Probably means groovy-cps needs to call Throwable.addSuppressedException somewhere.

            Unassigned Unassigned
            rtyler R. Tyler Croy
            Votes:
            2 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: