I tried this:
I created a workflow where tasks are executed sequentially from a list (tasks). After each task executes, it is removed from the list using del(.tasks[0]), ensuring that only the remaining tasks proceed.
If a task fails, the catch block should log the failed task and remove it from the list before proceeding.
(Basically I need to execute multiple blocks within a single try and catch instead of using a try and catch each for each block)
Below is the sample workflow I created to test this scenario:
document:
dsl: 1.0.0-alpha5
namespace: default
name: try-catch-context-test
version: 0.1.1
do:
- dummyTaskSetForTry:
do:
- setTasksList:
set:
failedTasks: []
tasks:
- dummyTask1
- dummyTask2
- dummyTask3
- dummyTask4
export:
as: $context + .
- switchBlock:
switch:
- decisionMaker:
when: ${ ($context.tasks != null) and ($context.tasks | length ) > 0 }
then: executeTasks
- default:
then: exitSwitch
- executeTasks:
try:
- determineTask:
switch:
- jumpToTask1:
when: ${ $context.tasks != null and ($context.tasks | map(. == "dummyTask1") | any) }
then: task1
- jumpToTask2:
when: ${ $context.tasks != null and ($context.tasks | map(. == "dummyTask2") | any) }
then: task2
- jumpToTask3:
when: ${ $context.tasks != null and ($context.tasks | map(. == "dummyTask3") | any) }
then: task3
- jumpToTask4:
when: ${ $context.tasks != null and ($context.tasks | map(. == "dummyTask4") | any) }
then: task4
- task1:
set:
dummySet1: dummySet1
export:
as: $context | del(.tasks[0])
- remListAftertask1:
set:
remListAftertask1: ${ $context.tasks }
export:
as: $context + .
- task2:
set:
dummySet2: dummySet2
export:
as: $context | del(.tasks[0])
- remListAftertask2:
set:
remListAftertask2: ${ $context.tasks }
export:
as: $context + .
- task3:
call: set-widget-state:5.0.0@default # no such version exists, added here to hit the catch block
with:
id: test-id
state:
values: test-values
export:
as: $context | del(.tasks[0])
- remListAftertask3:
set:
remListAftertask3: ${ $context.tasks }
export:
as: $context + .
- task4:
set:
dummySet4: dummySet4
export:
as: $context | del(.tasks[0])
- remListAftertask4:
set:
remListAftertask4: ${ $context.tasks }
export:
as: $context + .
catch:
do:
- setErrorFlag:
set:
catchBlock: ${ $context.tasks[0] }
failedBuildTasks: ${ $context.failedTasks + [$context.tasks[0]] }
export:
as: $context | del(.tasks[0])
- goToMainSwitchBlock:
set:
listAfterCatch: ${ $context.tasks }
dummy: true
export:
as: $context + .
then: switchBlock
- exitSwitch:
set:
dummy: true
This happened:
-
The first two tasks (dummyTask1 and dummyTask2) executed correctly, and each was successfully removed from tasks.
-
When dummyTask3 failed, the catch block executed.
-
Instead of removing dummyTask3 (the failed task), dummyTask1 (which had already been removed) was removed again.
-
This suggests that the catch block is not considering the updated context from the switch execution and is instead using an outdated state.
I expected this:
Is there a workaround?
No response
Anything else?
No response
Platform(s)
No response
Community Notes
- Please vote by adding a 👍 reaction to the issue to help us prioritize.
- If you are interested to work on this issue, please leave a comment.name: Bug Report 🐞
I tried this:
I created a workflow where tasks are executed sequentially from a list (tasks). After each task executes, it is removed from the list using del(.tasks[0]), ensuring that only the remaining tasks proceed.
If a task fails, the catch block should log the failed task and remove it from the list before proceeding.
(Basically I need to execute multiple blocks within a single try and catch instead of using a try and catch each for each block)
Below is the sample workflow I created to test this scenario:
This happened:
The first two tasks (dummyTask1 and dummyTask2) executed correctly, and each was successfully removed from tasks.
When dummyTask3 failed, the catch block executed.
Instead of removing dummyTask3 (the failed task), dummyTask1 (which had already been removed) was removed again.
This suggests that the catch block is not considering the updated context from the switch execution and is instead using an outdated state.
I expected this:
The catch block should remove the task that failed (dummyTask3 in this case).
It should respect the most recent updates to the context (tasks) before handling errors.
Is there a workaround?
No response
Anything else?
No response
Platform(s)
No response
Community Notes